django-forms: разрешить вошедшему в систему пользователю отправлять только один комментарий к отдельному сообщению

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

модели

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):
...

Просмотры

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)

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

Кто-нибудь знает, какое потенциальное решение может быть? Или если я даже делаю это правильно?


person Darius Mandres    schedule 06.09.2017    source источник


Ответы (1)


Возможным решением может быть:

  1. Получить текущие Post комментарии в поле зрения
  2. Отфильтруйте комментарии по вашему request.user
  3. Посмотрите, вернул ли запрос непустой набор запросов

Что-то типа:

from django.core.exceptions import PermissionDenied


def add_comment(request, slug):
    post = get_object_or_404(Post, slug=slug)

    # Get the comments posted by the user for this post
    user_comments = post.comments.filter(user=request.user)

    if request.method == 'POST':
            form = CommentForm(request.POST or None)

            # Check if there are any comments posted by the user
            if user_comments:
                # If there are any, raise an error
                raise PermissionDenied('You have already commented on this post.') 

            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
    }

    return render(request, template, context)

Конечно, здесь можно изменить выдачу ошибок, но основная идея — получить комментарии, отфильтровать их по request.user и посмотреть, есть ли они.

person wencakisa    schedule 06.09.2017
comment
Благодаря тонну! Все, что мне было нужно, это «user_comments = post.comments.filter(user=request.user)». Я завернул весь запрос формы в этот оператор if, так что, если пользователь уже оставил отзыв, он даже не позволит ему получить доступ к странице формы add_comment. Это так просто, если подумать, но хоть убей, я не мог понять, как получить информацию о том, прокомментировал ли пользователь или нет. Спасибо еще раз!! - person Darius Mandres; 06.09.2017