2013-06-28 21 views
0

我在使用django-newsletter正在處理一個項目。我需要從訂戶那裏獲得一些額外的信息,所以我擴展了這個模型。但是,當我保存表單時出現以下異常:IntegrityError at/newsletter/ newsletter_subscription.newsletter_id可能不是NULL我非常感謝與我面臨的問題的協助。保存擴展Django包時的IntegrityError

我的模型構造如下:

from django.db import models 
from newsletter.models import Subscription 
from datetime import datetime 


class Subscriber(Subscription): 
    fname = models.CharField(max_length=100) 
    lanme = models.CharField(max_length=100) 
    dob = models.DateField(default=datetime.today) 
    postcode = models.CharField(max_length=8) 
    phone = models.CharField(blank=True, max_length=100) 

    def __unicode__(self): 
     return self.email 

我的形式:

from django import forms 
from crispy_forms.helper import FormHelper 
from crispy_forms.layout import Submit 
from myapp.apps.mjnewsletter.models import Subscriber 
from newsletter.forms import SubscribeRequestForm 

class NewsletterSubForm(forms.ModelForm): 
    class Meta: 
     model = Subscriber 
     exclude = ('user', 
        'name_field', 
        'newsletter', 
        'create_date', 
        'activation_code', 
        'subscribed', 
        'subscribe_date', 
        'unsubscribed', 
        'unsubscribe_date') 
     labels = { 
      'fname': 'First Name', 
      'lanme': 'Last Name', 
      'email_field': 'Email', 
      'dob': 'Date of Birth', 
      'postcode': 'Post Code', 
      'phone': 'Phone', 
     } 

    def __init__(self, *args, **kwargs): 
     super(NewsletterSubForm, self).__init__(*args, **kwargs) 
     self.helper = FormHelper() 
     self.helper.form_method ='post' 
     self.helper.add_input(Submit('submit', 'Subscribe')) 
     self.fields.keyOrder = [ 
      'fname', 
      'lanme', 
      'email_field', 
      'dob', 
      'postcode', 
      'phone', 
     ] 

而我的觀點:

from django.http import HttpResponseRedirect 
from django.shortcuts import render 
from myapp.apps.mjnewsletter.models import Subscriber 
from myapp.apps.mjnewsletter.forms import NewsletterSubForm 


def subscribe(request): 

    if request.method =='POST': 
     form = NewsletterSubForm(request.POST) 
     if form.is_valid(): 
      fname, lname, email_field, dob, postcode, phone = (form.cleaned_data['fname'], 
                   form.cleaned_data['lanme'], 
                   form.cleaned_data['email_field'], 
                   form.cleaned_data['dob'], 
                   form.cleaned_data['postcode'], 
                   form.cleaned_data['phone']) 

      subscriber = Subscriber.objects.create(fname=fname, 
            lanme=lname, 
            email_field=email_field, 
            dob=dob, 
            postcode=postcode, 
            phone=phone) 
      subscriber.save() 

      messages.add_message(request, message.SUCCESS, 'Thank you for subscribing to our newsletter.') 
    else: 
     form = NewsletterSubForm() 

    return render(request, 'mjnewsletter/subscribe.html', {'form': form}) 
+0

你嘗試刪除數據庫然後運行syncdb嗎?這很可能是發生了什麼...... –

+0

數據庫中的表存在Kenvin的答案,正確地解決了這個問題。 –

回答

0

你繼承newsletter.models.Subscription其中有一個外鍵newsletter.models.Newsletter。您的子類模型包含其父模型的所有字段 - 如果沒有意義,請再次查看multi-table inheritance上的文檔。

這意味着,當你保存新Subscriber你必須提供所有父Subscription模型需要的字段,這些字段中的一個是外鍵newsletter.models.Newsletter不能爲空。所以你必須在你的subscribe視圖中提供。

+0

他的錯誤是完全相反的,他改變了somehing功能爲空值,這可能「不可能」爲已存儲的一些數據 –

+1

@SamueleMattiuzzo我可能只是愚蠢的,但我不知道他在哪裏更改newsletter_id我認爲那是你正在談論的東西?)爲空值。給我一個提示? – Kevin

+0

感謝凱文的幫助。你是對的,我需要更密切地關注我繼承的這個班級。我列出了其他我曾經做過無知的假設的其他問題。 –