Django形成新手问题

时间:2009-03-07 01:40:12

标签: python django forms

好吧,我对Django Forms感到茫然,因为文档似乎并没有完全涵盖我正在寻找的东西。一旦你超越了最基本的形式,至少它似乎会嘎然而止。我非常愿意链接到好的文档,或者链接到涵盖此主题的好书,作为答案。基本上,这是它如何分解,我有3个模型(测验,问题,答案)。我有20个问题,每个测验有4个可能的答案(多项选择)。数字可以变化,但你明白了。

我需要为这些项目创建一个表单,就像您在多项选择测验中所期望的那样。但是,当我在模板中手动创建表单时,而不是使用django.forms,我得到以下内容:

基数为10的int()的无效文字:'test'

所以我试图弄乱django.forms,但我想我只是没有理解如何用这些来构建一个合适的形式。非常感谢任何帮助,谢谢。

这里的模型是值得的:

class Quiz(models.Model):
    label = models.CharField(blank=True, max_length=400)
    slug = models.SlugField()

    def __unicode__(self):
        return self.label

class Question(models.Model):
    label = models.CharField(blank=True, max_length=400)
    quiz = models.ForeignKey(Quiz)

    def __unicode__(self):
        return self.label

class Answer(models.Model):
    label = models.CharField(blank=True, max_length=400)
    question = models.ForeignKey(Question)
    correct = models.BooleanField()

    def __unicode__(self):
        return self.label

2 个答案:

答案 0 :(得分:6)

是的,我必须同意这里的文档和示例非常缺乏。对于您所描述的案例而言,这不是开箱即用的解决方案,因为它有三层深度:quiz-> question-> answer。

Django有model inline formsets解决了两层深层问题。要生成所需的表单,您需要做的是:

  1. 加载测验表单(只是模型中的标签文本框)
  2. 加载一个问题表单集:QuestionFormSet(queryset = Question.objects.filter(quiz = quiz))
  3. 对于每个问题,加载答案formset的方式与加载问题formset的方式大致相同
  4. 请确保以正确的顺序保存所有内容:quiz-> question-> answer,因为每个较低级别都需要上面项目的外键

答案 1 :(得分:2)

首先,为给定的Model创建ModelForm。在这个例子中,我正在为测验做这个,但你可以冲洗并重复其他模型。对于咯咯笑,我正在将“标签”设置为具有预设选项的选择框:

from django.models import BaseModel
from django import forms
from django.forms import ModelForm

CHOICES_LABEL = (
    ('label1', 'Label One'),
    ('label2', 'Label Two')

)

class Quiz(models.Model):
    label = models.CharField(blank=True, max_length=400)
    slug = models.SlugField()

    def __unicode__(self):
        return self.label

class QuizForm(ModelForm):
    # Change the 'label' widget to a select box.
    label = forms.CharField(widget=forms.Select(choices=CHOICES_LABEL))

    class Meta:
       # This tells django to get attributes from the Quiz model
       model=Quiz

接下来,在您的views.py中,您可能会遇到以下情况:

from django.shortcuts import render_to_response
from forms import *
import my_quiz_model

def displayQuizForm(request, *args, **kwargs):
   if request.method == 'GET':
       # Create an empty Quiz object. 
       # Alternately you can run a query to edit an existing object.

       quiz = Quiz()
       form = QuizForm(instance=Quiz)
       # Render the template and pass the form object along to it.
       return render_to_response('form_template.html',{'form': form})

   elif request.method == 'POST' and request.POST.get('action') == 'Save':
       form = Quiz(request.POST, instance=account)
       form.save()
       return HttpResponseRedirect("http://example.com/myapp/confirmsave")

最后,您的模板将如下所示:

<html>
  <title>My Quiz Form</title>
  <body>

  <form id="form" method="post" action=".">

   <ul>
    {{ form.as_ul }}
   </ul>

   <input type="submit" name="action" value="Save">
   <input type="submit" name="action" value="Cancel">
  </form>

  </body>
</html>