我在其中一个表单中添加了一个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,
})
答案 0 :(得分:4)
在你的领域:
mail_lists = models.ManyToManyField(Mailists, blank=True)
您已将blank=True
添加到字段中,但未添加null=True
。这意味着您的数据库期望该字段具有值。所以当它没有你得到一个错误。
<强> null 强>
如果为True,Django会将空值存储为数据库中的NULL。默认值为False。 请注意,空字符串值将始终存储为空字符串,而不是NULL。仅对非字符串字段(如整数,布尔值和日期)使用null = True。对于这两种类型的字段,如果要在表单中允许空值,则还需要设置blank = True,因为null参数仅影响数据库存储(请参阅空白)。
<强> blank 强>
如果为True,则允许该字段为空。默认值为False。
请注意,这与null不同。 null纯粹与数据库相关,而blank与验证相关。如果字段为空= True,则表单验证将允许输入空值。如果字段为空= False,则需要该字段。
以下是其他一些解释: