3

最初のステップでモデル A のインスタンスが作成され、次に 2 番目のステップで、ステップ 1 のモデル A インスタンスを含む必要がある ForeignKey フィールドを使用してモデル B が作成されるフォーム ウィザードがあります。したがって、検証のために作業するには、ステップ 1 のフォームをステップ 1 と 2 の間に保存する必要があります (おそらくcommit=False、ユーザーがステップに戻ることを選択した場合)。これを行う最善の方法は何ですか?

4

1 に答える 1

3

「完了」ウィザードメソッドを再実装すると、フォームのデータをデータベースに保存する瞬間に管理できると思います(最終的な目的によって異なりますが、ウィザードを使用している場合は、それを求めている可能性がありますデータはウィザードの最後に保存されます)。それらについて考えてください:

  • ユーザーが「ステップ 1」を通過した場合、このステップで入力したデータは正しいです。
  • ユーザーが「ステップ 2」を通過した場合、このステップで入力したデータも正しいということになります。django docの詳細を読んでください。

これにより、ウィザードの「最後のステップ」では A データが有効になるため、「ステップ 2」で「A」データをあまり気にせずに B のフォームを作成できます。私の考えでは、B から保存しようと考えているデータのみで B フォームを作成できますが、A への参照はありません。たとえば、以下のような BModel があるとします。

Class B(models.Model):
    a = models.ForeignKey('A')
    name = models.CharField(max_lenght=50)

B のフォームを次のように作成できます。

Class BForm(forms.Form):
    name = forms.CharField(max_length=50)

そして最後に、すべてのフォームが有効な「完了」メソッドで、次のform_listことができます。

def done(self, form_list, **kwargs):
    b_data = {}
    for form in form_list:
        # Getting the A instance
        if isinstance(form, AForm):
            a_instance = form.save()
        # Getting B data
        elif isinstance(form, BForm):
            b_data = form.cleaned_data
        else:
            form.save()
    b_data.update({'a': a_instance})
    BModel.objects.create(**b_data)
    return redirect("success_url")
于 2013-01-07T01:12:03.820 に答える