Ошибка при использовании формы комментариев на сайте: (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)