【问题标题】:IntegrityError, NOT NULL constraint failedIntegrityError,NOT NULL 约束失败
【发布时间】:2023-03-29 22:50:01
【问题描述】:

我想为我的 Django 应用中的帖子添加标签。

我可以通过管理界面添加标签,但是当我尝试通过我创建的表单添加标签时,我得到了一个 IntegrityError。

我在现有主题中找不到相同错误的解决方案。我跑了makemigrationsmigrate

来自models.py

class Post(models.Model):
    title = models.CharField(null=False, blank=False)
    text = models.TextField()

class Tag(models.Model): 
    post = models.ForeignKey('my_app.Post', on_delete=models.CASCADE, related_name='tags')
    tag_text = models.CharField()

观点:

def post_add_tags(request, pk): 
    post= get_object_or_404(Post, pk=pk)
    if request.method == "POST": 
        form = TagForm(request.POST)
        if form.is_valid():
            tag = form.save()
            tag.post= post
            tag.save()
            return redirect("single_post_view", pk=post.pk)
    else: 
        form = TagForm()
    return render(request, "add_tags.html", {"form": form})

来自forms.py的表格:

class TagForm(forms.ModelForm): 
    class Meta:
        model = Tag
        fields = ["tag_text"]

模板:

<form method="POST"> {% csrf_token %}
    {{ form.as_p }}
    <button type="submit" class="save btn btn-default">Add tags</button>
</form>

错误:

/post/4/add_tags/ 处的完整性错误

NOT NULL 约束失败:my_app_tag.post_id

我使用的是 Django 2.2 版,Python 3.6.8。

【问题讨论】:

  • 这一行tag = form.save(),应该是tag = form.save(commit=False)

标签: django django-models integrity


【解决方案1】:

在设置所有必填字段之前不要save form,特别是foreign keys

def post_add_tags(request, pk): 
    post= get_object_or_404(Post, pk=pk)
    if request.method == "POST": 
        form = TagForm(request.POST)
        if form.is_valid():
            tag = form.save(commit=False)
            tag.post= post
            tag.save()
            return redirect("single_post_view", pk=post.pk)
    else: 
        form = TagForm()
    return render(request, "add_tags.html", {"form": form})

【讨论】:

  • 谢谢,这行得通,但为什么呢?在文档中它说“如果你用commit=False调用save(),那么它将返回一个尚未保存到数据库中的对象。在这种情况下,你可以在结果上调用save()模型实例。”但是,在这种情况下,为什么我不能立即保存呢?
  • 因为post外键将是null
  • 哦,现在我明白了。再次感谢!
猜你喜欢
  • 2023-03-20
  • 2020-12-19
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 2022-08-10
  • 2021-08-07
  • 2020-06-28
  • 2019-02-14
相关资源
最近更新 更多