3

Django でネストされたフォームセットを作成する方法を理解しようとしています。ネストされたフォームセットに関して他にもいくつかの質問があることに気付きましたが、それをすべて自分のケースに適用する方法を理解できないようです (私は Django にまったく慣れていません)。

私はここで例を見てきました: http://yergler.net/blog/2009/09/27/nested-formsets-with-django/ - 私はDjango 1.3を使用していますが、明らかにこの例には微調整が必​​要です1.3で動作します。私が持っている他のわずかな違いは、私のモデルでは、ブロック構築 (または私の場合はクイズの質問) の間に 1 対多の関係があるのではなく、多対多の関係があることです (将来的には、しかし今ではなく、同じ質問を複数のクイズに含めることを許可したい)-しかし、これが現在のエラーの原因だとは思いません。

これまでのところ、私は持っています:

フォーム.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'

この例は明らかに既存のブロック オブジェクトを編集するためのものですが、今のところ、新しいクイズ/質問を作成しようとしています (したがって、空のフォームを使用します。作成が機能したら、編集に戻ります)。部分的に問題?また、質問に instance=Quiz がないため、混乱していると思います (Yergler の例では、各建物に instance=Block があります)。

どんな助けや指針も大歓迎です!アレックス

4

0 に答える 0