I have a model Post in which the User can leave a Comment along with a set of ratings. I would like to limit the user comments to only one per post. I'm having trouble setting that up in my view
models
class Comment(models.Model):
post = models.ForeignKey(Post, related_name="comments")
user = models.ForeignKey(User, related_name="usernamee")
...
class UserProfile(models.Model):
user = models.OneToOneField(User, related_name='profile')
class Post(models.Model):
...
views
def add_comment(request, slug):
post = get_object_or_404(Post, slug=slug)
# I tried wrapping all of the below in an "if" statement, something like
# if request.user.comment.exists(): to check if the user has already
# left a comment on this specific post, but I'm not sure of the right way to perform such a check here.
if request.method == 'POST':
form = CommentForm(request.POST or None)
if form.is_valid():
comment = form.save(commit=False)
comment.post = post
comment.user = request.user
comment.email = request.user.email
comment.picture = request.user.profile.profile_image_url()
comment.save()
messages.success(request, "Thank you for leaving a review!")
return redirect('blog:post_detail', slug=post.slug)
else:
messages.error(request, "Something went wrong! We weren't able to process your review :(")
else:
form = CommentForm()
template = "blog/post/add_comment.html"
context = {
'form': form,
'post': post,
#'comment_count': comment_count
}
return render(request, template, context)
I am under the impression that all I would need is to wrap the entire form code from my add_comment view in some sort of validation system that checks whether or not the current, logged-in user has already left a comment on that specific post (see comments in view)
Anybody know what a potential solution might be? Or if I'm even doing this the right way?
A possible solution can be to:
Post
comments in viewrequest.user
Something like:
Of course, you can modify the error raising here, but the main idea is to get the comments and filter them by
request.user
and see if there are any.