1
我有一個Physical_therapy_order模型和一個事件模型(一個事件有外鍵到Physical_therapy_order)。我有一個允許用戶創建新事件的視圖。它還具有來自Physical_therapy_order模型的3個字段的表單。Django窗體保存post_save信號導致衝突
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並對其進行一些修改。現在,如果我先保存了事件表單,那麼信號的變化就不會發生。如果我首先保存該平臺,則會丟棄該平臺更改,並從該信號發生更改。
這很重要:該平臺正在編輯三個完全不同於post_save信號的字段。所以它不像他們修改相同的數據,只有相同的模型實例。我以爲窗體只能保存meta.fields屬性中的字段。爲什麼會發生這種情況?另外,如果我先保存該平臺,那麼當保存了事件表單時不應該使用更新的physical_therapy_order的信號?我不確定我是否在正確的軌道上?
感謝,合作。 2分:我仍然不明白爲什麼保存我的原始平臺不起作用:我認爲保存表單只保存它的字段,所以即使它具有緩存的physical_therapy_order,它又有什麼關係。另外,我嘗試了一種類似於你使用Physical_therapy_order.get(pk = pt_pk)的方法,然後嘗試重新加載表單並保存它:這不起作用。但是您從eventform.save()獲取PT訂單的方法很好地工作。 – rsp
@rsp,問題是因爲對象屬性過時,因爲新屬性保存在數據庫中。我相信'Physical_therapy_order.get(pk = pt_pk)'也應該有效。你在保存'eventform'後做了這個嗎? – Rohan