【问题标题】:IntegrityError when saving extended Django Package保存扩展 Django 包时出现 IntegrityError
【发布时间】:2013-06-28 00:26:46
【问题描述】:

我在我目前正在进行的项目中使用django-newsletter。我需要从订阅者那里获得一些额外的信息,所以我扩展了模型。但是,当我保存表单时,我得到以下异常:IntegrityError at /newsletter/ newsletter_subscription.newsletter_id 可能不为 NULL 我将非常感谢帮助解决我面临的问题。

我的模型构造如下:

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})

【问题讨论】:

  • 您是否尝试过删除数据库然后运行syncdb?这很可能是发生了什么......
  • 数据库中的表存在 肯文的回答在下面适当地解决了这个问题。

标签: python django


【解决方案1】:

您正在继承 newsletter.models.Subscription 的子类,它具有 newsletter.models.Newsletter 的外键。您的子类模型具有其父模型的所有字段 - 如果这没有意义,请再查看 multi-table inheritance 上的文档。

这意味着当您保存新的 Subscriber 时,您必须提供父 Subscription 模型所需的所有字段,其中一个字段是 newsletter.models.Newsletter 的外键,不能为 NULL .所以你必须在subscribe 视图中提供它。

【讨论】:

  • 他的错误恰恰相反,他改变了一些东西以具有空值,对于一些已经存储的数据“可能不是”
  • @SamueleMattiuzzo 我可能只是愚蠢,但我看不出他在哪里将 newsletter_id (我认为这就是你在谈论的东西?)更改为空值。给我一个提示?
  • 感谢凯文的帮助。你说得对,我需要更密切地关注我继承的类,我整理了我做出不知情假设的各种其他问题。
猜你喜欢
  • 2018-01-22
  • 1970-01-01
  • 2018-06-17
  • 2014-06-15
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 2017-06-11
相关资源
最近更新 更多