Django NOT NULL 约束失败
Django NOT NULL constraint failed
我刚刚开始学习 Django,我 运行 遇到了一个问题。我有一个 modelFormSet,旨在为您创建的问题添加 3 个选择。当我不使用 modelFormset 并且只添加一个问题时,我没有问题,但是当我尝试遍历 modelsFormset 并将每个选项分配给刚刚创建的问题时,我收到以下错误:
NOT NULL constraint failed: polls_choice.question_id
我认为这与 question_id 未传递给选择模型有关,但我不确定如何修复它。我有 运行 个新迁移,我认为我不能将空白或空值设置为 True,因为我需要相关的选择和问题。预先感谢您的帮助!
型号
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
assigned_to = models.ManyToManyField(User)
def __str__(self):
return self.question_text
def was_published_recently(self):
now = timezone.now()
return now - datetime.timedelta(days=1) <= self.pub_date <= now
was_published_recently.admin_order_field = 'pub_date'
was_published_recently.boolean = True
was_published_recently.short_description = 'Published recently?'
class Choice(models.Model):
question = models.ForeignKey(Question)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
表格
class CreateQuestion(forms.ModelForm):
class Meta:
model = Question
fields = ('question_text', 'assigned_to', 'pub_date',)
class AddChoices(forms.ModelForm):
class Meta:
model = Choice
fields = ('choice_text',)
查看
def create_question(request):
choices_formset = modelformset_factory(Choice, form=AddChoices, fields=('choice_text',), extra=3)
if request.method == 'POST':
question_form = CreateQuestion(data=request.POST)
choice_form = choices_formset(request.POST, request.FILES)
if question_form.is_valid and choice_form.is_valid:
question = question_form.save()
for choice in choice_form:
choice.question = question
choice.save()
return HttpResponseRedirect(reverse('polls:index'))
else:
return render(request, 'polls/createquestion.html', {'question_form': question_form,
'choice_form': choice_form, })
else:
question_form = CreateQuestion()
choice_form = choices_formset(queryset=Choice.objects.none(),)
return render(request, 'polls/createquestion.html', {'question_form': question_form,
'choice_form': choice_form, })
当您遍历 for choice in choice_form
时,每一项都是一个表单,因此设置 question
属性不起作用。
相反,您应该使用 commit=False
保存,设置问题,然后将对象保存到数据库。
for form in choice_form:
choice = form.save(commit=False)
choice.question = question
choice.save()
问题在这里:
for choice in choice_form:
choice.question = question
choice.save()
您在此处迭代 AddChoices
表单,而不是 Choice
对象。这意味着,您将问题保存为表单的属性,而不是模型实例的属性,并且不会传播到模型实例中。
要修复它,您可以尝试:
for form in choice_form:
choice = form.save(commit=False)
choice.question = question
choice.save()
我刚刚开始学习 Django,我 运行 遇到了一个问题。我有一个 modelFormSet,旨在为您创建的问题添加 3 个选择。当我不使用 modelFormset 并且只添加一个问题时,我没有问题,但是当我尝试遍历 modelsFormset 并将每个选项分配给刚刚创建的问题时,我收到以下错误:
NOT NULL constraint failed: polls_choice.question_id
我认为这与 question_id 未传递给选择模型有关,但我不确定如何修复它。我有 运行 个新迁移,我认为我不能将空白或空值设置为 True,因为我需要相关的选择和问题。预先感谢您的帮助!
型号
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
assigned_to = models.ManyToManyField(User)
def __str__(self):
return self.question_text
def was_published_recently(self):
now = timezone.now()
return now - datetime.timedelta(days=1) <= self.pub_date <= now
was_published_recently.admin_order_field = 'pub_date'
was_published_recently.boolean = True
was_published_recently.short_description = 'Published recently?'
class Choice(models.Model):
question = models.ForeignKey(Question)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
表格
class CreateQuestion(forms.ModelForm):
class Meta:
model = Question
fields = ('question_text', 'assigned_to', 'pub_date',)
class AddChoices(forms.ModelForm):
class Meta:
model = Choice
fields = ('choice_text',)
查看
def create_question(request):
choices_formset = modelformset_factory(Choice, form=AddChoices, fields=('choice_text',), extra=3)
if request.method == 'POST':
question_form = CreateQuestion(data=request.POST)
choice_form = choices_formset(request.POST, request.FILES)
if question_form.is_valid and choice_form.is_valid:
question = question_form.save()
for choice in choice_form:
choice.question = question
choice.save()
return HttpResponseRedirect(reverse('polls:index'))
else:
return render(request, 'polls/createquestion.html', {'question_form': question_form,
'choice_form': choice_form, })
else:
question_form = CreateQuestion()
choice_form = choices_formset(queryset=Choice.objects.none(),)
return render(request, 'polls/createquestion.html', {'question_form': question_form,
'choice_form': choice_form, })
当您遍历 for choice in choice_form
时,每一项都是一个表单,因此设置 question
属性不起作用。
相反,您应该使用 commit=False
保存,设置问题,然后将对象保存到数据库。
for form in choice_form:
choice = form.save(commit=False)
choice.question = question
choice.save()
问题在这里:
for choice in choice_form:
choice.question = question
choice.save()
您在此处迭代 AddChoices
表单,而不是 Choice
对象。这意味着,您将问题保存为表单的属性,而不是模型实例的属性,并且不会传播到模型实例中。
要修复它,您可以尝试:
for form in choice_form:
choice = form.save(commit=False)
choice.question = question
choice.save()