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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-19 10:16:39  来源:igfitidea点击:

IntegrityError in Django

pythondjango

提问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=Trueto 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. 这意味着您的数据库期望该字段具有值。所以当它没有时,你会得到一个错误。

null

空值

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 参数仅影响数据库存储(参见空白)。

blank

空白的

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:

以下是其他一些解释: