2013-06-28 31 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

感谢凯文的帮助。你是对的,我需要更密切地关注我继承的这个班级。我列出了其他我曾经做过无知的假设的其他问题。 –