3

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

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

4

0 回答 0