1

複数ページのフォームを作成しようとしています。2 ページ目のフィールド要素の数は、最初のページの回答によって定義されます。

formWizard をセットアップしましたが、次のページのセットアップを変更するには process_step() を使用する必要があることを理解しています。既存のフォーム定義を拡張して要素を追加するか、2 つ以上のフォーム定義をマージして正しい数のフォーム要素を生成することができますが、これを行う方法がわかりません。

例えば

ページ 1 - 興味のあるテーマを選択してください:

ページ 2 - 各科目について: 関連する質問をします。質問はアプリケーションで個別のフォームとして定義されますが、1 つのページに表示するか、1 つのフォームに統合する必要があります。

どんな助けでも大歓迎です。

浪費家

4

2 に答える 2

1

浪費家、

少なくとも現時点では、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

これでうまくいくことを願っています:)

于 2009-12-26T17:49:05.120 に答える
0

とは思わない

self.form_list[1] = RelatedQForm(chosen_subs)

部分が動作します。私はいつもエラーメッセージを受け取ります:

object is not callable

form_list は、そのインスタンスではなく、RelatedQForm (フォームの名前) のみを受け入れるようです。

于 2011-01-26T21:26:11.190 に答える