Django строит вложенные формы

Я пытаюсь понять, как создать вложенные наборы форм в Django. Я заметил, что есть несколько других вопросов, касающихся вложенных наборов форм, но я не могу понять, как применить все это к моему случаю (я совсем новичок в Django).

Я смотрел на пример здесь: http://yergler.net/blog/2009/09/27/nested-formsets-with-django/ - хотя я использую Django 1.3 и, очевидно, этот пример нуждается в некоторой настройке для работа с 1.3. Другое небольшое отличие, которое у меня есть, заключается в том, что в моей модели, вместо того, чтобы иметь отношение 1-многие между построением блоков (или вопрос-опрос в моем случае), у меня есть отношение многие ко многим (так как я могу в будущем (но не сейчас, хочу разрешить один и тот же вопрос быть в нескольких викторинах) - но я не думаю, что это является причиной моей текущей ошибки.

Пока что у меня есть:

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'

Этот пример, очевидно, предназначен для редактирования существующего блочного объекта, но сейчас я просто пытаюсь создать новый тест / вопросы (поэтому, используя пустую форму - вернусь к ее редактированию, как только у меня будет работать создание) - так что я предполагаю, что это частично проблема? Также я думаю, что я запутался, поскольку у моего Вопроса нет экземпляра = Викторина (в примере с Йерглером у каждого Здания есть экземпляр = Блок).

Любая помощь или указатели очень ценится! Alex

0 ответов

Другие вопросы по тегам