2017-09-06 1 views
0

Ich habe ein Modell Beitrag, in dem der Benutzer einen Kommentar mit einer Reihe von Bewertungen hinterlassen kann. Ich möchte die Benutzerkommentare auf nur einen pro Beitrag beschränken. Ich habe Probleme, dass bis in meiner Ansichtdjango-forms: erlauben eingeloggten Benutzer, nur einen Kommentar pro einzelnen Beitrag einzureichen

Modelle

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

Ansichten

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) 

Ich bin unter dem Eindruck einstellen, dass alles, was ich brauchen würde, ist der gesamte Formular Code wickelt von meinem add_comment view in einer Art von Validierungssystem, das überprüft, ob der aktuelle angemeldete Benutzer bereits einen Kommentar zu diesem bestimmten Post hinterlassen hat (siehe Kommentare in der Ansicht)

Jeder weiß, was eine mögliche Lösung sein könnte? Oder wenn ich das überhaupt richtig mache?

Antwort

0

kann eine mögliche Lösung sein:

  1. Holen Sie sich die aktuellen Post Kommentare im Hinblick
  2. Filter die Kommentare von Ihrem request.user
  3. Prüfen Sie, ob die Abfrage eine nicht leere queryset
zurück

Etwas wie:

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) 

Natürlich können Sie die Fehlererhöhung hier ändern, aber die Hauptidee ist, die Kommentare zu bekommen und sie durch request.user zu filtern und zu sehen, ob es irgendwelche gibt.

+0

Vielen Dank! Alles, was ich brauchte, war 'user_comments = post.comments.filter (user = request.user)'. Ich habe meine gesamte Formularanforderung in die if-Anweisung eingeschlossen, sodass der Benutzer, wenn er bereits eine Rezension hinterlassen hat, diese nicht einmal auf die formularseite add_comment zugreifen kann. Es ist so einfach, darüber nachzudenken, aber für das Leben von mir konnte ich nicht herausfinden, wie man die Information darüber erhält, ob der Benutzer kommentiert hat oder nicht. Danke noch einmal!! – dmandres

+0

@dmandres Gern geschehen! – wencakisa

Verwandte Themen