好吧,我对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
答案 0 :(得分:6)
是的,我必须同意这里的文档和示例非常缺乏。对于您所描述的案例而言,这不是开箱即用的解决方案,因为它有三层深度:quiz-> question-> answer。
Django有model inline formsets解决了两层深层问题。要生成所需的表单,您需要做的是:
答案 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>