我正试图了解如何在Django中创建嵌套的formsets。我注意到嵌套表单集还有其他几个问题,但我似乎无法弄清楚如何将它全部应用到我的案例中(我对Django来说很新)。
我一直在看这里的例子:http://yergler.net/blog/2009/09/27/nested-formsets-with-django/ - 虽然我正在使用Django 1.3,显然这个例子需要一些调整来使用1.3。我的另一个细微差别是,在我的模型中,而不是在块建筑之间建立一个多关系(或者在我的情况下是测验问题),我有很多关系(因为我可能,将来) ,但不是现在,想让同一个问题在多个测验中) - 但我不认为这是我当前错误的原因。
到目前为止,我有:
forms.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示例中,每个建筑物都有一个实例=块)。
非常感谢任何帮助或指示! 亚历