Python Django 中的完整性错误
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/18243149/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
IntegrityError in Django
提问by Kevin
I added A Many2Many field in one of my forms and now I am getting an IntegrityError on submit. The exact error text is
我在其中一个表单中添加了 A Many2Many 字段,现在我在提交时收到 IntegrityError 。确切的错误文本是
IntegrityError at /add_person/ hireterm_person.mail_lists may not be NULL
/add_person/hiringterm_person.mail_lists 处的 IntegrityError 可能不是 NULL
It worked fine until I added the new field. When I look at the POST data on the debug change, I see it being passed, so I don't know where the break occurs.
在我添加新字段之前,它运行良好。当我查看有关调试更改的 POST 数据时,我看到它正在传递,因此我不知道中断发生在哪里。
Models
楷模
from django.db import models
from django.forms import ModelForm
from django import forms
from django.contrib.auth.models import User
class Mailists(models.Model):
name = models.CharField(blank=True, max_length=100)
email = models.CharField(blank=True, max_length=100)
def __unicode__(self):
return u'%s' % (self.name)
class Person(models.Model):
ROLE_CHOICES = (
('Mrkt', 'Marketing'),
('Fin/Off', 'Finance / Office'),
('Care', 'Care'),
('Sales', 'Sales'),
)
ROLE_TYPE = (
('Full', 'Full Time'),
('Part', 'Part Time'),
('Intern', 'Intern'),
)
first_name = models.CharField(blank=True, max_length=100)
last_name = models.CharField(blank=True, max_length=100)
date_added = models.DateField(auto_now_add=True)
date_start = models.DateField(auto_now=False)
role = models.CharField(max_length=100, default = "", choices = ROLE_CHOICES)
manager = models.ForeignKey('self', limit_choices_to = {'is_manager': True}, null=True, blank=True)
title = models.CharField(blank=True, max_length=100)
role_type = models.CharField(max_length=100, default = "", choices = ROLE_TYPE)
laptop_needed = models.BooleanField(default=True)
phone_needed = models.BooleanField(default=True)
desk_loco = models.CharField(blank=True, max_length=100)
mail_lists = models.ManyToManyField(Mailists, blank=True)
notes = models.CharField(blank=True, max_length=500)
is_manager = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
def __unicode__(self):
return u'%s %s' % (self.first_name, self.last_name)
class PersonForm(ModelForm):
mail_lists = forms.ModelMultipleChoiceField(queryset=Mailists.objects.all(), widget=forms.CheckboxSelectMultiple(), required=False)
class Meta:
model = Person
EDIT
编辑
I added mail_lists = request.POST.getlist('mail_lists'). When I add a print to this, the list returned is all of the check boxes, put the POST data is still a single string, the last box checked.
我添加了mail_lists = request.POST.getlist('mail_lists')。当我为此添加打印时,返回的列表是所有复选框,POST 数据仍然是单个字符串,最后一个框被选中。
Views
观看次数
from hireterm.models import Person, Mailists, PersonForm
from django.shortcuts import get_object_or_404, render
from django.template import Context, loader
from django.http import HttpResponseRedirect, HttpResponse
from django.contrib.auth.decorators import login_required
from django.contrib.auth import authenticate, login
from django.contrib.auth import logout
from django.core.mail import send_mail
@login_required
def home(request):
return render(request, 'hireterm/home.html')
def add_person(request):
if request.method == 'POST':
mail_lists = request.POST.getlist('mail_lists')
person_form = PersonForm(request.POST)
if person_form.is_valid():
person_form.save()
return HttpResponseRedirect('/new_hire') # Redirect after POST
else:
person_form = PersonForm() # An unbound form
return render(request, 'hireterm/additem.html', {
'form': person_form,
})
采纳答案by Timmy O'Mahony
On your field:
在你的领域:
mail_lists = models.ManyToManyField(Mailists, blank=True)
you have added blank=True
to the field, but not null=True
. This means that your DB is expecting that field to have a value. So when it doesn't you get an error.
您已添加blank=True
到该字段,但未添加null=True
. 这意味着您的数据库期望该字段具有值。所以当它没有时,你会得到一个错误。
If True, Django will store empty values as NULL in the database. Default is False. Note that empty string values will always get stored as empty strings, not as NULL. Only use null=True for non-string fields such as integers, booleans and dates. For both types of fields, you will also need to set blank=True if you wish to permit empty values in forms, as the null parameter only affects database storage (see blank).
如果为 True,Django 将在数据库中将空值存储为 NULL。默认值为假。请注意,空字符串值将始终存储为空字符串,而不是 NULL。仅对非字符串字段(例如整数、布尔值和日期)使用 null=True。对于这两种类型的字段,如果您希望在表单中允许空值,您还需要设置 blank=True,因为 null 参数仅影响数据库存储(参见空白)。
If True, the field is allowed to be blank. Default is False.
Note that this is different than null. null is purely database-related, whereas blank is validation-related. If a field has blank=True, form validation will allow entry of an empty value. If a field has blank=False, the field will be required.
如果为 True,则该字段可以为空。默认值为假。
请注意,这与 null 不同。null 纯粹与数据库相关,而空白与验证相关。如果一个字段有空白=真,表单验证将允许输入一个空值。如果某个字段有空白 = False,则该字段将是必需的。
Here are some other explanations:
以下是其他一些解释: