Django中的IntegrityError
Django中的IntegrityError
我在一个表单中添加了一个Many2Many字段,现在当我提交时出现IntegrityError。精确的错误文本是
/add_person/ hireterm_person.mail_lists 的IntegrityError不允许为NULL
在添加新字段之前一切正常。当我查看调试更改时的POST数据时,我看到它正在传递,所以我不知道错误在哪里发生。
模型
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
编辑
我添加了mail_lists = request.POST.getlist(\'mail_lists\')。当我在此添加打印时,返回的列表是所有复选框,但POST数据仍然是单个字符串,最后一个选中的框。
视图
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, })
admin 更改状态以发布 2023年5月21日
在你的字段上:
mail_lists = models.ManyToManyField(Mailists, blank=True)
你已经将blank=True
添加到了该字段,但未添加null=True
。这意味着你的数据库期望该字段有一个值。所以当它没有值时,你会得到一个错误。
如果为True,Django将在数据库中将空值存储为NULL。默认为False。
请注意,空字符串值将始终存储为空字符串,而不是NULL。仅对于非字符串字段(如整数、布尔值和日期),才使用null=True。对于这两种类型的字段,如果希望允许表单中的空值,则还需要设置blank=True,因为null参数仅影响数据库存储(参见blank)。
如果为True,将允许该字段为空。默认为False。
请注意,这与null不同。null仅与数据库相关,而blank与验证相关。如果一个字段具有blank=True,表单验证将允许输入空值。如果一个字段具有blank=False,该字段将是必需的。
这里有一些其他的解释: