I'm trying to implement a comment section below each blog on my site. I've got the form rendering but when I try to post a comment I get the following error:
(1048, "Column 'comment_post_id' cannot be null")
I cannot see what I'm doing wrong, I've also followed a tutorial step by step, although it is 2 years old.
here's my code: sorry if I missed any, please ask if you require more.
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})
CodePudding user response:
You're trying to assign a BlogPost object to the .blog attribute of your user_comment. Try the following, it should work:
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()
One thing I would do for making your code look better is rename the fields of your blogComment model without the 'comment_' prefix. So comment_post -> post. Also use PascalCase for classes, so BlogComment and convert your functions to lower_case_with_underscores. All of this is according to the PEP-8 coding conventions and will make your code read more comfortable for others: https://peps.python.org/pep-0008/
CodePudding user response:
Here you are setting the BlogPost
object to blog
attribute. But you don't have a blog
field, do you? You have to use exactly what you have set in models, so I guess you need to change that:
user_comment.blog = blog
To that:
user_comment.comment_post = blog
I don't what what course you have taken, but it's awful naming convention. It should be more like:
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)
...
Then you can call it in more readable way. Here are examples:
# 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)