2012-11-29 33 views
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的信號?我不確定我是否在正確的軌道上?

回答

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() 
+0

感謝,合作。 2分:我仍然不明白爲什麼保存我的原始平臺不起作用:我認爲保存表單只保存它的字段,所以即使它具有緩存的physical_therapy_order,它又有什麼關係。另外,我嘗試了一種類似於你使用Physical_therapy_order.get(pk = pt_pk)的方法,然後嘗試重新加載表單並保存它:這不起作用。但是您從eventform.save()獲取PT訂單的方法很好地工作。 – rsp

+0

@rsp,問題是因爲對象屬性過時,因爲新屬性保存在數據庫中。我相信'Physical_therapy_order.get(pk = pt_pk)'也應該有效。你在保存'eventform'後做了這個嗎? – Rohan