2

調査に django のフォーム ウィザードを使用しています。調査全体を単一のモデルに保存したいと考えています。FormWizard の各ステップでモデルのサブセットを使用するために、モデルを複数のフォームに分割しました。問題は、最後にそれらをどのように結合するかです。私のmodels.pyは次のようになります:

class BigSurvey(models.Model):
    field1 = models.TextField()
    field2 = models.TextField()
    ...
    field40 = models.CharField(max_length=10)

私のforms.pyは次のようなものです:

class FirstPageForm(ModelForm):
    class Meta:
        model = BigSurvey
        fields = ('field1', 'field2')

class SecondPageForm(ModelForm):
    class Meta:
        model = BigSurvey
        fields = ('field3', 'field4')

合計 4 つのフォームと 30 のフィールドについても同様です。サブクラス化された各モデル フォームのフィールドを組み合わせると、BigSurvey モデルのすべてのフィールドになります。

これにより、BigSurvey を 4 つのステップに分けることができます。フォーム ウィザードは、4 つのフォーム (FirstPageForm、SecondPageForm など) のそれぞれのリストであるオブジェクト form_list を返します。

これら 4 つのフォームを単一の BigSurvey オブジェクトに結合して保存するにはどうすればよいですか?

更新: フォームとフィールドを反復処理し、新しいフォームに値の辞書を入力することで解決しました。setattr を使用して入力すると (以下の Colleen の回答に従って)、バインドされていない形式になります。私の作業ソリューション:

newvalues={}
for form in form_list:
    for field in form.cleaned_data.keys():
        newvalues[field]=form.cleaned_data[field]   
newform = QuestForm(newvalues)
newform.save()
4

1 に答える 1

1

各フォームのすべてのフィールドを繰り返し処理し、BigSurvey フィールドをそれらの値に割り当てることができます。

bg = BigSurvey()

for form in form_list
    for field in form.cleaned_data.keys():
        setattr(bg, field, form.cleaned_data[field])

bg.save()
于 2012-11-07T22:30:27.770 に答える