2012-08-28 56 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