简体   繁体   English

Django 中的完整性错误

[英]IntegrityError in Django

I added A Many2Many field in one of my forms and now I am getting an IntegrityError on submit.我在其中一个表单中添加了 A Many2Many 字段,现在我在提交时收到 IntegrityError 。 The exact error text is确切的错误文本是

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').我添加了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.当我为此添加打印时,返回的列表是所有复选框,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,
    })

On your field:在你的领域:

mail_lists = models.ManyToManyField(Mailists, blank=True)

you have added blank=True to the field, but not null=True .您已将blank=True添加到该字段,但未添加null=True This means that your DB is expecting that field to have a value.这意味着您的数据库期望该字段具有值。 So when it doesn't you get an error.所以当它没有时,你会得到一个错误。

null

If True, Django will store empty values as NULL in the database.如果为 True,Django 将在数据库中将空值存储为 NULL。 Default is False.默认值为假。 Note that empty string values will always get stored as empty strings, not as NULL.请注意,空字符串值将始终存储为空字符串,而不是 NULL。 Only use null=True for non-string fields such as integers, booleans and dates.仅对非字符串字段(例如整数、布尔值和日期)使用 null=True。 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).对于这两种类型的字段,如果您希望在表单中允许空值,您还需要设置 blank=True,因为 null 参数仅影响数据库存储(参见空白)。

blank 空白

If True, the field is allowed to be blank.如果为 True,则该字段可以为空。 Default is False.默认值为假。

Note that this is different than null.请注意,这与 null 不同。 null is purely database-related, whereas blank is validation-related. null 纯粹与数据库相关,而空白与验证相关。 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.如果某个字段有空白 = False,则该字段将是必需的。

Here are some other explanations:以下是其他一些解释:

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM