Ошибка при использовании формы комментариев на сайте: (1048, "Column 'comment_post_id' cannot be null")

Я пытаюсь реализовать раздел комментариев под каждым блогом на моем сайте. У меня есть форма, но когда я пытаюсь опубликовать комментарий, я получаю следующую ошибку:

(1048, "Column 'comment_post_id' cannot be null")

Я не могу понять, что я делаю неправильно, я также следовал учебнику шаг за шагом, хотя ему уже 2 года.

вот мой код: извините, если я что-то упустил, пожалуйста, спрашивайте, если вам нужно больше.

models.py:

class BlogPost(models.Model):
    blog_title = models.CharField(max_length=100, null=False, blank=False, default="")
    blog_article = RichTextUploadingField(null=True, blank=True, default="ici")
    blog_image = models.ImageField(null=True, blank=True, upload_to="images", default="default.png")
    blog_date = models.DateField(auto_now_add=True)
    blog_published = models.BooleanField(default=False)
    blog_featured = models.BooleanField(default=False)
    slug = models.SlugField()
        
    def save(self, *args, **kwargs):
        self.slug = self.slug or slugify(self.blog_title)
        super().save(*args, **kwargs)

    def __str__(self):
        return self.blog_title
    

class blogComment(models.Model, ):
    comment_post = models.ForeignKey(BlogPost, related_name="comments", on_delete=models.CASCADE)
    comment_name = models.CharField(max_length=100)
    comment_text = models.TextField(max_length=1000)
    comment_date = models.DateTimeField(auto_now_add=True)
    comment_status = models.BooleanField(default=True)

    class Meta:
            ordering = ("comment_date",)

    def __str__(self):
        return '%s -- Name: %s'%(self.comment_post.blog_title, self.comment_name)

views.py:

def viewBlog(request, slug):
    
    try:
        blog = BlogPost.objects.get(slug=slug)
    except BlogPost.DoesNotExist:
        print("ViewBlog with this slug does not exist")
        blog = None

    comments = blog.comments.filter(comment_status=True)

    user_comment = None

    if request.method == 'POST':
        comment_form = commentForm(request.POST)
        if comment_form.is_valid():
            user_comment = comment_form.save(commit=False)
            user_comment.blog = blog
            user_comment.save()
            return HttpResponseRedirect('/' + blog.slug)
    else:
        comment_form = commentForm()

    return render(request, 'view-blog.html', {'blog': blog, 'slug': slug, 'comments': user_comment, 'comments': comments, 'comment_form': comment_form})

Вы пытаетесь присвоить объект BlogPost атрибуту .blog вашего user_comment. Попробуйте сделать следующее, это должно сработать:

if request.method == 'POST':
    comment_form = commentForm(request.POST)
    if comment_form.is_valid():
        user_comment = comment_form.save(commit=False)
        user_comment.comment_post = blog
        user_comment.save()
        return HttpResponseRedirect('/' + blog.slug)
else:
    comment_form = commentForm()

Для того, чтобы ваш код выглядел лучше, я бы переименовал поля модели blogComment без префикса 'comment_'. То есть comment_post -> post. Также используйте PascalCase для классов, например BlogComment, и преобразуйте ваши функции в lower_case_with_underscores. Все это соответствует конвенциям кодирования PEP-8 и сделает ваш код более удобным для чтения другими: https://peps.python.org/pep-0008/

Здесь вы устанавливаете объект BlogPost в атрибут blog. Но у вас нет поля blog, не так ли? Вы должны использовать именно то, что задали в моделях, поэтому, полагаю, вам нужно изменить это:

user_comment.blog = blog

К этому:

user_comment.comment_post = blog

Я не знаю, какой курс вы прошли, но это ужасное соглашение об именовании. Это должно быть больше похоже на:

class Comment(models.Model):
    post = models.ForeignKey(Post, related_name="comments", on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    text = models.TextField(max_length=1000)
    ...

Тогда вы можете вызывать его более читабельным способом. Вот примеры:

# clean approach
comment = Comment.objects.get(id=1)
print(comment.post)
print(comment.name)

# course approach
blog_comment = blogComment.objects.get(id=1)
print(blog_comment.comment_post)
print(blog_comment.comment_name)
Вернуться на верх