2

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 を使用するべきではありませんか? 正しい軌道に乗っているかどうかさえわかりませんか?

4

1 に答える 1

0

これはキャッシュされたオブジェクトが原因だと思います。

私が提案するのは

  • eventform最初に保存
  • クエリデータベースの新しいインスタンスを取得するpt_orderか、eventformの保存されたインスタンスを介して取得します
  • 次に、フォームを再作成して保存します。

サンプルコードの変更:

# your code
if keep_saving:
    evt = eventform.save()
    # I'm not sure exact name of your field name for pt_order in Event model, change appropriately
    newptform = PT_schedule_form(data=request.POST, instance= evt.pt_order)
    newpt = newptform.save()
于 2012-11-29T04:40:59.990 に答える