基本上,这就是它的分解方式,我有 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
是的,我必须同意这里确实缺乏文档和示例。对于您所描述的情况,这不是开箱即用的解决方案,因为它深入三层:测验->问题->答案。
Django 有模型内联表单集,它解决了两层深度的问题。您需要做的是生成您想要的表格:
首先,为给定的模型创建一个模型表单。在此示例中,我为测验执行此操作,但您可以对其他模型进行冲洗和重复。为了咯咯笑,我将“标签”设置为带有预设选项的选择框:
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>