无法找到此错误的解决方案:Django:django.db.utils.IntegrityError:NOT NULL



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

这是一个看起来很有希望的答案,但我无能为力。我认为它没有获得父帖子 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 %}

对不起,任何错误。提前谢谢。

我相信

发生此错误是因为您尝试在注释模型中创建一个新记录,该记录将related_post字段留空,而不应该这样做。如果您愿意将此字段留空,则可以在 models.py 中将该字段更改为以下内容:

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

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

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

多亏了@cbuch1800我终于得到了答案。这是它和对文件的更改:

在 { {form.as_p}}之后的模板文件中,我添加了一行来传递当前帖子 主键 (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})

最新更新