浪費家、
少なくとも現時点では、FormWizard で複数のフォームを 1 つのページにマージする方法がわかりません。django 1.2 では、FormSets を FormWizards のステップとして含めることができますが (このチケットに従って)、それらは同じフォームの複数のコピーのみを処理し、多くのフォームのコンパイルは処理しません。しかし、あなたが求めることを行う方法があります:
from django.contrib.formtools.wizard import FormWizard
from django import forms
class SubjectForm(forms.Form):
subjects = forms.MultipleChoiceField(choices = (('language', 'language'),
('sport','sport')))
class RelatedQForm(forms.Form):
"""Overload the __init__ operator to take a list of forms as the first input and generate the
fields that way."""
def __init__(self, interested_subjects, *args, **kwargs):
super(RelatedQForm, self).__init__(*args, **kwargs)
for sub in interested_subjects:
self.field[sub] = forms.CharField(label = "What do you think about %s" % subject)
class SubjectWizard(FormWizard):
def done(self, request, form_list):
process_form_list(form_list)
def process_step(self, request, form, step):
if step == 1:
chosen_subs = form.cleaned_data['subjects']
self.form_list[1] = RelatedQForm(chosen_subs)
このコードを使用して、ビューで通常行うように FormWizard をインスタンス化し、ウィザード クラスにすべてを裏で処理させます。
一般的な考え方は、「RelatedQForm」のinitクラスをオーバーロードして、フィールドを動的に変更することです。このコード スニペットはhereから取得されました。init演算子内の処理を好きなだけ複雑にすることができます。「フォームのフィールドを for ループ内の if-elif ブロックとして含める」を読んでください。プログラムで現在のフォームからフィールドを取得しますが、それを理解するにはそれらを確認する必要があります。
「process_form_list」関数は、次のようなものを使用してフィールドをループする必要があります。
for field, val in form.cleaned_data.items():
do_stuff
これでうまくいくことを願っています:)