我试图弄清楚如何在 Django 中创建嵌套的表单集。我注意到嵌套表单集还有其他几个问题,但我似乎无法弄清楚如何将它全部应用到我的案例中(我对 Django 很陌生)。
我一直在看这里的例子:http: //yergler.net/blog/2009/09/27/nested-formsets-with-django/ - 虽然我使用的是 Django 1.3,显然这个例子需要一些调整与 1.3 一起工作。我的另一个细微差别是,在我的模型中,不是在积木构建(或在我的情况下是测验问题)之间存在一对多的关系,而是我有一个多对多的关系(因为我可能在未来,但不是现在,想让同一个问题出现在多个测验中) - 但我不认为这是我当前错误的原因。
到目前为止,我有:
表格.py:
ResponseFormset = inlineformset_factory(Question, Response, extra=4)
class BaseQuestionFormSet(BaseFormSet):
def add_fields(self, form, index):
super(BaseQuestionFormSet, self).add_fields(form, index)
# created the nested formset
try:
instance = self.get_queryset()[index]
pk_value = instance.pk
except IndexError:
instance=None
pk_value = hash(form.prefix)
# store the formset in the .nested property
form.nested = [
ResponseFormset(data=self.data,
instance = instance,
prefix = 'RESPONSES_%s' % pk_value)]
class QuizForm(ModelForm):
class Meta:
model = Quiz
fields = ('title', 'description')
widgets = {
'title': forms.TextInput(),
'description': forms.Textarea(attrs={'cols': 80, 'rows': 3}),
}
class QuestionForm(ModelForm):
class Meta:
model = Question
fields = ('title', 'type')
widgets = {
'title': forms.Textarea(attrs={'cols': 80, 'rows': 3}),
}
class ResponseForm(ModelForm):
class Meta:
model = Response
fields = ('title', 'score')
widgets = {
'title': forms.TextInput(),
'score': forms.DecimalField,
}
然后在views.py中:
def create_quiz(request):
QuestionFormSet = formset_factory(QuestionForm,extra=5,formset=BaseQuestionFormSet)
if request.method == 'POST':
quiz_form = QuizForm(request.POST)
question_formset = forms.QuestionFormSet(request.POST,)
if quiz_form.is_valid():
quiz = quiz_form.save(commit=False)
quiz.owner = request.user
quiz.save()
#if question_formset.is_valid():
# do something here
#return HttpResponseRedirect('saved/')
else:
quiz_form = QuizForm() # An unbound form
question_formset = QuestionFormSet()
return render(request, 'mquiz/quiz.html', {'quiz_form': quiz_form,'question_formset':question_formset})
我得到的错误是:
'QuestionFormFormSet' object has no attribute 'get_queryset'
该示例显然是用于编辑现有的块对象,但现在我只是想创建新的测验/问题(因此使用空表单 - 一旦创建工作将返回编辑它) - 所以猜测那是部分问题?另外我认为我搞混了,因为我的问题没有实例=测验(在 Yergler 示例中,每个建筑物都有一个实例=块)。
非常感谢任何帮助或指示!亚历克斯