2011-02-14 67 views
0

我正在嘗試保存一對ModelFormset表單,但遇到IntegrityError。下面是代碼:Django:在保存ModelFormset表單時出現的奇怪IntegrityError

billing_formset = BillingFormSet(request.POST,prefix='billing') 
    cc_formset = CCFormSet(request.POST,prefix='cc') 

    if billing_formset.is_valid() and cc_formset.is_valid(): 
     bp = UserBillingProfile() 
     cc = UserCreditCard() 
     for form in billing_formset.forms: 
      billing_profile = form.save(commit=False) 
      billing_profile.user = request.user 
      bp = billing_profile.save() 
     for form in cc_formset.forms: 
      cc = form.save(commit=False) 
      cc.billing_profile = bp 
      cc = form.save() 

此代碼引起以下代碼:

IntegrityError在[URL移除] (1048, 「列user_billing_profile_id'不能爲空」)


編輯:這裏是一些迭代代碼,也修復了我的錯字。我遇到了基本相同的問題。

 billing_profile_form = billing_formset.forms[0] 
     cc_form = cc_formset.forms[0] 

     unsaved_billing_profile = billing_profile_form.save(commit=False) 
     user_billing_profile = unsaved_billing_profile.save() 

     unsaved_cc = cc_form.save(commit=False) 
     unsaved_cc.user_billing_profile = user_billing_profile 
     cc = unsaved_cc.save() 

問題行給出:「無法分配無:‘’不允許空值」 UserCreditCard.user_billing_profile看來unsaved_billing_profile.save()返回null?爲什麼?


這是一種瘋狂;一切似乎都是正確的。保存結算資料時我沒有遇到任何錯誤。關於我應該檢查的任何想法?在第二個循環中,事情似乎出錯了,其中bp顯然具有None的值。

在此先感謝。

+0

不是問題的答案,但有一個在你的代碼邏輯的問題:每個cc`的`的實例將被分配到bp`的`的* *最後例如,因爲你分別遍歷它們。 – 2011-02-14 10:23:16

+0

真的......我已經限制了最大輸入形式計數1,並且通過非迭代地進行更清潔。我發佈了迭代代碼,因爲非迭代代碼似乎有問題。 – John 2011-02-14 14:34:17

回答

0

這意味着您試圖將user_billing_profile設置爲None的模型實例保存,看起來您正在調用「billing_profile」而不是「user_billing_profile」。

每次未指定commit = False時,「save」方法都會返回None。你應該改爲調用是這樣的:

billing_profile.save() 
bp = billing_profile.instance 
相關問題