【问题标题】:Unable to find the solution for this error : Django: django.db.utils.IntegrityError: NOT NULL constraint failed: book_comment.related_post_id无法找到此错误的解决方案:Django: django.db.utils.IntegrityError: NOT NULL constraint failed: book_comment.related_post_id
【发布时间】:2017-11-15 16:52:50
【问题描述】:

简而言之:
我创建了一个 Post 模型和 Comment 模型并创建了一个评论表单,我正在提供一个 URL,它将显示所有帖子、相关评论和评论表单以输入新的 cmets。随着提交页面重新加载新的 cmets。但是当我提交评论时,我收到了错误:
django.db.utils.IntegrityError: NOT NULL constraint failed: book_comment.related_post_id

这是一个answer,看起来很有希望,但我无能为力。 我认为它没有获得父帖子 ID。

加长版
这是我的模型文件:

def user_image_path(instance, filename):
    return f"profile/user_{random.randint(1,1000)}_{filename}"

class Post(models.Model):

    post_title = models.CharField(max_length=250)
    post_creator = models.CharField(max_length=150)
    creator_pic = models.ImageField(upload_to=user_image_path)
    post_body = models.TextField()
    post_created = models.DateTimeField(auto_now_add=True)
    post_updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f"{self.post_title} **{self.post_creator}**"

class Comment(models.Model):
    related_post = models.ForeignKey(Post, related_name="comments")
    comment_creator = models.CharField(max_length=150)
    comment_body = models.CharField(max_length=1024)
    comment_created = models.DateTimeField(auto_now_add=True)
    comment_updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f"{self.comment_creator}"

这是我的表格:

from django import forms
from .models import Post, Comment


class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['comment_creator', 'comment_body']

这是视图:

from django.shortcuts import render, HttpResponseRedirect,reverse
from .models import Comment, Post
from .forms import CommentForm
# Create your views here.

def servePage(request):
    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            form.save()
            HttpResponseRedirect(reverse('serve'))
    else:
        form = CommentForm()
    posts = Post.objects.all()

    return render(request, 'book/showpost.html', {'posts': posts, 'form': form})

这是我的 html 模板:

{% extends 'book/base.html' %}

{% block content %}
    <h1>Welcome to book of life</h1>
    <h2>New posts</h2>
    <ul>
        {% for post in posts %}
            <li>{{ post.post_title }} by <small>{{ post.post_creator }}</small></li>
            <p>{{ post.post_created|timesince }}</p>
            <p>Content: <span>{{ post.post_body }}</span></p>
{#            <br>#}
            <h3>Comments:</h3>
            {% for comment in post.comments.all %}
                <p>{{ comment.comment_creator }} => {{ comment.comment_body }}</p>
            {% endfor %}
            <form method="post">
                {% csrf_token %}
                {{ form.as_p }}
                <input type="submit" name="comment">
            </form>
            <br><br>
        {% endfor %}
    </ul>
{% endblock %}

如有任何错误,我们深表歉意。提前致谢。

【问题讨论】:

    标签: django python-3.x web-applications


    【解决方案1】:

    我认为发生此错误是因为您尝试在评论模型中创建一条新记录,该记录将related_post 字段留空,而实际上不应该这样做。如果您对该字段留空感到满意,您可以在 models.py 中将该字段更改为以下内容:

    related_post = models.ForeignKey(Post, related_name="comments", null=True)
    

    或者,您可能不希望此为空白。如果您将related_post 添加到表单中的字段,将创建一个包含所有帖子的下拉框,您可以选择其中一个进行评论。

    您也许还可以自动检测您正在评论的帖子,但我不确定这是如何完成的。

    【讨论】:

    • 现在我明白了,你说得对,我没有将评论与任何帖子相关联,我以为我与帖子相关联。现在只需要找到与该帖子相关的方法,无需任何下拉菜单,它应该自动完成
    【解决方案2】:

    感谢@cbuch1800,我终于得到了答案。这是对文件的更改:

    在 {{form.as_p}} 之后的模板文件中,我添加了一行来传递当前帖子 Primary Key(id) 以查看。
    模板文件:

    <form method="post">
      {% csrf_token %}
      {{ form.as_p }}
      <input type="hidden" name="post_pk" value={{ post.pk }}>
      <input type="submit" name="comment">
    </form>
    

    在视图文件中检索到帖子对象并将帖子对象添加到相关评论中。
    视图:

    def servePage(request):
        if request.method == 'POST':
            form = CommentForm(request.POST)
            post = Post.objects.get(pk=request.POST['post_pk'])
            if form.is_valid():
                comment = form.save(commit=False)
                comment.related_post = post
                ## related_post from Comment model
                comment.save()
                HttpResponseRedirect(reverse('serve'))
        else:
            form = CommentForm()
        posts = Post.objects.all()
    
        return render(request, 'book/showpost.html', {'posts': posts, 'form': form})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-26
      • 2022-12-04
      • 2022-11-24
      • 2020-08-07
      • 2020-09-13
      • 1970-01-01
      • 2022-10-31
      • 2021-05-08
      相关资源
      最近更新 更多