1

フォーム ウィザードを使用しようとしていますが、フィールドの選択肢を設定する場所がわかりません。

#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
4

1 に答える 1

1

You should call it using the class instead of object. So change your call to

QuizWizard.as_view(question_forms)(request)

Update:

The wizard view takes form class list as parameters not the form instance. You are creating form instances in question_forms and passing it to view.

If you want to pass instance for the form in each step, you can pass instance_dict. Something like ...

inst_dict = { '0': question_forms[0], #step 0 instance
              '1': question_forms[1], #step 1 instance
            }
QuestFormList = [QuestionForm, QuestionForm ...]
QuizWizard.as_view([QuestFormList, instance_dict=inst_dict)(request)
于 2013-03-28T14:40:18.160 に答える