Physical_therapy_order モデルと Event モデルがあります (イベントには Physical_therapy_order への外部キーがあります)。ユーザーが新しいイベントを作成できるビューがあります。また、Physical_therapy_order モデルからの 3 つのフィールドを持つフォームもあります。
def PTEventCreateView(request, pt_pk):
#get the pt order and create an a form for that order
pt_order = get_object_or_404(Physical_therapy_order, pk=pt_pk)
ptform = PT_schedule_form(instance=pt_order)
if request.POST:
eventform = PTEventForm(data=request.POST)
ptform = PT_schedule_form(data=request.POST, instance=pt_order)
if eventform.is_valid() and ptform.is_valid():
#I do some checks here that compare data across the two forms.
# if everything looks good i mark keep_saving=True so I can
# continue to save all the data provided in the two forms
if keep_saving:
ptform.save()
eventform.save()
#...send user to succss page
これは、例外を除いて正常に機能します。私の PTEvent モデルには、post_save シグナルに関数が関連付けられています。この関数は、イベントに関連する pt_order を取得し、それにいくつかの変更を加えます。ここで、最初にイベントフォームを保存すると、シグナルからの変更は発生しません。最初にptformを保存すると、ptformの変更が破棄され、シグナルからの変更が発生します。
これは重要です: ptform は、post_save シグナルとはまったく異なる 3 つのフィールドを編集しています。つまり、同じデータを変更しているわけではなく、同じモデル インスタンスのみを変更しています。フォームは meta.fields 属性にフィールドを保存するだけだと思いました。なぜこれが起こるのでしょうか?また、最初に ptform を保存すると、eventsform が保存されたときに、信号が更新された physical_therapy_order を使用するべきではありませんか? 正しい軌道に乗っているかどうかさえわかりませんか?