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!