Python 保存扩展Django包时的IntegrityError
我正在一个项目中使用我目前正在工作。我需要从订阅者那里获得一些额外的信息,所以我扩展了模型。然而,当我保存表单时,我遇到了以下异常:IntegrityError at/newsletter/ 时事通讯\u订阅。时事通讯\u id可能不为空我将非常感谢您对我面临的问题给予帮助 我的模型构造如下:Python 保存扩展Django包时的IntegrityError,python,django,Python,Django,我正在一个项目中使用我目前正在工作。我需要从订阅者那里获得一些额外的信息,所以我扩展了模型。然而,当我保存表单时,我遇到了以下异常:IntegrityError at/newsletter/ 时事通讯\u订阅。时事通讯\u id可能不为空我将非常感谢您对我面临的问题给予帮助 我的模型构造如下: from django.db import models from newsletter.models import Subscription from datetime import datetime
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})
您正在子类化
newsletter.models.Subscription
,该子类的外键为newsletter.models.newsletter
。您的子类模型具有其父模型的所有字段-如果这没有意义,请再次查看上的文档
这意味着当您保存新的
订户时
必须提供父订阅
模型所需的所有字段,其中一个字段是newsletter.models.newsletter
的外键,不能为空。因此,您必须在订阅视图中提供该选项。您是否尝试删除数据库,然后运行syncdb?这很可能就是发生的情况…数据库中的表存在Kenvin下面的答案适当地解决了这个问题。他的错误恰恰相反,他将某些内容更改为空值,对于某些数据“可能不是”stored@SamueleMattiuzzo我可能只是在装傻,但我不知道他在哪里改变了通讯(我想这就是你所说的吗?)设置为空值。给我一个提示?谢谢你的帮助Kevin。你是对的,我需要更密切地关注我继承的类,我整理了各种其他问题,这些问题是我未提供信息的假设。