Django构建嵌套的formsets

时间:2012-11-24 11:31:13

标签: django django-forms formset

我正试图了解如何在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示例中,每个建筑物都有一个实例=块)。

非常感谢任何帮助或指示! 亚历

0 个答案:

没有答案