2012-09-18 66 views
1
deals_formset_factory = modelformset_factory(Deal, form=DealCForm, extra=1)  
attached_deals_formset = deals_formset_factory(request.POST, prefix='deals') 

當由於我Deal模型的某些字段未在形式示出,因此不能由用戶設置(但M2M字段被示出,並且可以由用戶設定),我不能只是做一個如何保存M2M場一個formset提交=假

for fm in attached_deals_formset:     
    if fm.has_changed(): 
     fm.save() 

因爲它會中斷。

所以理論上在這種情況下的想法是做

deal = fm.save(commit=False) 
... 
deal.save() 

但這不是我的M2M領域內保存處理。直通表保持不變。解決這個問題的最佳方法是什麼?

class Deal(models.Model):    
    deal_id    = UUIDField() 
    .... 
    sales_item   = models.ManyToManyField(SalesItem)  
+1

你試過重寫窗體的save()方法嗎? – karthikr

回答

3

我找到了解決方案,沒有必要重寫save方法。

當你的模型具有 與其他模型許多一對多關係使用提交=假的另一個副作用是看到。如果您的模型具有 多對多關係,並且在保存 表單時指定了commit = False,則Django無法立即保存多對多關係的表單數據。這是因爲無法將實例的多對多數據保存到 數據庫中,直到該實例存在爲止。

要解決此問題,每次使用 提交=假保存表單,Django會增加一個save_m2m()方法,您的ModelForm 子類。你手動保存由 形式產生的實例後,可以調用save_m2m()保存許多一對多表單數據

Source

deal.save()後,簡單地說:

fm.save_m2m()