2012-08-28 99 views
1

我正在寻找一种方法来获取contact.id传递给我的ForeignKey字段。现在它返回一个错误,说明contact_id不能为空。“Column'contact_id'不能为空”与ForeignKey字段

这里是我的模型:

class Contact(models.Model): 
    first_name = models.CharField(max_length=100, help_text="First Name") 
    last_name = models.CharField(max_length=100, help_text="Last Name") 
    email_address = models.EmailField(max_length=275) 
    address = models.CharField(max_length=10, choices=ADDRESS_CHOICES) 

    def __unicode__(self): 
     return "%s %s" % (self.first_name, self.last_name) 


class LetterHead(models.Model): 
    contact = models.ForeignKey(Contact, related_name='letterhead') 
    address = models.CharField(max_length=10, choices=ADDRESS_CHOICES) 
    quantity = models.CharField(max_length=4, choices=QUANTITY_CHOICES) 

这里是我的看法:

class ContactForm(forms.ModelForm): 
    address = forms.ChoiceField(required=True, widget=RadioSelect(), choices=ADDRESS_CHOICES,) 

    class Meta: 
     model = Contact 


class LetterHeadForm(forms.ModelForm): 
    address = forms.ChoiceField(required=False, widget=RadioSelect(), choices=ADDRESS_CHOICES) 

    class Meta: 
     model = LetterHead 
     exclude = ('contact',) 
     widgets = { 
      'quantity': forms.Select(choices=QUANTITY_CHOICES), 
     } 


LetterHeadFormSet = modelformset_factory(LetterHead, 
    form=LetterHeadForm, extra=2, max_num=2) 

这里是我的看法:

class OrderFormProcessor(object): 
    def __init__(self, contact=None, contact_form_class=ContactForm, 
      letterhead_form_class=LetterHeadFormSet, 
      send_notification=False): 
     self.contact_form_class = contact_form_class 
     self.letterhead_form_class = letterhead_form_class 
     self.send_notification = send_notification 
     self.contact = contact 

    def process(self, request, context=None): 
     if not context: 
      context = {} 

     data = request.POST or None 
     contact = self.contact 

     contact_form = self.contact_form_class(data, 
       instance=contact) 

     forms = dict(
      contact_form=contact_form, 
     ) 

     formsets = dict(
      letterhead_formset=self.letterhead_form_class(data, prefix='letterhead_'), 
     ) 

     if request.method == 'POST': 
      for f in forms.values() + formsets.values(): 
       print f.__class__, f.is_valid() 

      form_is_valid = all([f.is_valid() for f in forms.values() + formsets.values()]) 
      if form_is_valid: 
       contact = forms['contact_form'].save() 

       letterhead_form = formsets['letterhead_formset'] 

       for lf in letterhead_form: 
        lf.contact_id = contact.id 
        lf.save() 

       if self.send_notification: 
        email = OrderFormNotification(to=[settings.NO_REPLY_EMAIL_ADDRESS], 
        extra_context=data) 
        email.send() 
      else: 
       pass 

     all_forms = chain(forms.values(), chain.from_iterable(formsets.values())) 
     context = context.copy() 
     context.update(forms.items() + formsets.items()) 
     context.update(
      error_list=list(chain.from_iterable([form.errors.values() for form in all_forms])), 
     ) 

     return (forms, formsets), context 

回答

0

当你保存letterhead_form

letterhead_form = formsets['letterhead_formset'] 

for lf in letterhead_form: 
    lf.contact_id = contact.id 
    lf.save() 

变化

lf.contact_id = contact.id 

lf.contact = contact 

lf.contact__id = contact.id 

你没有正确地保存联系人对象。

+0

嗯,两个选项都给了我同样的错误(1048,“列'contact_id'不能为空') – tjoenz

+0

什么是形式['contact_form']返回?你能在控制台上打印表单['contact_form'],看看它能解决什么问题?另外,联系人对象是否正确创建? – karthikr

+0

当然可以。打印输出: [Tue Aug 28 28:50:56 2012] [error] ​​
<跨度类= ”帮助文件“>名字 [星期二08月28 15点50分56秒2012] [错误] <标签=”姓氏:​​
姓氏 ... 是的联系人正在数据库中正确创建。这是困扰我的一部分 – tjoenz