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