2

I am working on a film review system in Django and I am stuck with my upvote/like system. On my detail view I have:

class ReviewDetailView(DetailView):
    model = Review
    template_name = 'review.html'

    def get_context_data(self, *args, **kwargs):
        context = super(ReviewDetailView, self).get_context_data(**kwargs)
        stuff = get_object_or_404(Review, id=self.kwargs['pk'])
        upvoted = False
        if stuff.votes.filter(id=self.request.user.id).exists():
            upvoted = True
    
        total_votes = stuff.get_upvote_count
        context['total_votes'] = total_votes
        context['upvoted'] = upvoted
       return context

Which works perfectly and does what I want but I can't get it to work for my listview. So far have this, but obviously only takes account of the first object in the queryset.

class ReviewHomeListView(ListView):
    model = Review
    template_name = 'recent_reviews.html'

    def get_queryset(self):
        queryset = Review.objects.all().order_by('-posted_date')[:10]
        return queryset

    def get_context_data(self, **kwargs):
        context = super(ReviewHomeListView, self).get_context_data(**kwargs)
        stuff = Review.objects.last()
        upvoted = False
        if stuff.votes.filter(id=self.request.user.id).exists():
            upvoted = True
        total_votes = stuff.get_upvote_count
        context['total_votes'] = total_votes
        context['upvoted'] = upvoted
        return context

Here is the UpvoteView that that context['upvoted'] comes from:

def UpvoteView(request, pk):
    if request.user.is_authenticated:
        review = get_object_or_404(Review, id=request.POST.get('review_id'))
        upvoted = False
        if review.votes.filter(id=request.user.id).exists():
            review.votes.remove(request.user)
            upvoted = False
        else:
            review.votes.add(request.user)
            upvoted = True
        return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
    else:
        messages.info(request, 'You must be logged in to vote')
        return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

Any help or advice would be much appreciated!

Ross
  • 21
  • 3

0 Answers0