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