フォーム ウィザードを使用しようとしていますが、フィールドの選択肢を設定する場所がわかりません。
#views.py
class QuizWizard(SessionWizardView):
def done(self, form_list, **kwargs):
return render_to_response('done.html', {
'form_data':[form.cleaned_data for form in form_list],
})
#forms.py
class QuestionForm(forms.ModelForm):
#selection = forms.ChoiceField()
class Meta:
model = Question
オブジェクトを追加するための管理パネルのような空のフォームが表示されます。質問をフォームに渡し、質問フィールドに入力し、編集できず、送信しないようにしたいと考えています。
私が行った場合
(r'^(?P<quiz_id>\d+)', QuizWizard.as_view(get_form_list)),
関数 get_form_list には長さがありません
(r'^(?P<quiz_id>\d+)', QuizWizard.as_view(get_form_list(quiz_id))),
Quiz_id が不明です。
そのため、quiz_id をビュー関数に渡して、フォーム ウィザードで使用する質問フォームのリストを生成しようとしています。
urls.py
url(r'^(?P<quiz_id>\d+)', 'quiz.views.get_form_list'),
ビュー.py
class QuizWizard(SessionWizardView):
def done(self, form_list, **kwargs):
return render_to_response('done.html', {
'form_data':[form.cleaned_data for form in form_list],
})
def get_form_list(request, quiz_id):
quiz = Quiz.objects.get(id=quiz_id)
question_forms = []
for question in quiz.questions.all():
choices = []
for choice in question.choices.all():
choices.append(choice)
f = QuestionForm(instance=question)
question_forms.append(f)
return QuizWizard.as_view(question_forms)(request)
エラーメッセージが表示されます
issubclass() arg 1 must be a class
ローハンの答えに基づいて更新:
def get_form_list(request, quiz_id):
quiz = Quiz.objects.get(id=quiz_id)
question_forms = []
for question in quiz.questions.all():
choices = []
for choice in question.choices.all():
choices.append(choice)
f = QuestionForm(instance=question)
question_forms.append(f)
inst_dict = {}
for idx, question in enumerate(question_forms):
inst_dict[str(idx)] = question
print inst_dict
#inst_dict = { str(index(x)) : x for x in question_forms}
QuestFormList = []
for i in range(len(question_forms)):
QuestFormList.append(QuestionForm)
QuizWizard.as_view(QuestFormList, instance_dict=inst_dict)(request)
このコードでは、エラーが発生しています
'ModelFormOptions' object has no attribute 'many_to_many'
これが私のmodels.pyです
class Choice(models.Model):
choice = models.CharField(max_length=64)
def __unicode__(self):
return self.choice
#create a multiple choice quiz to start
class Question(models.Model):
question = models.CharField(max_length=64)
answer = models.CharField(max_length=64)
choices = models.ManyToManyField(Choice)
module = models.CharField(max_length=64)
def __unicode__(self):
return self.question
class Quiz(models.Model):
name = models.CharField(max_length=64)
questions = models.ManyToManyField(Question)
def __unicode__(self):
return self.name