2011-02-14 74 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