Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
266 views
in Technique[技术] by (71.8m points)

python - Django order by highest number of likes in homepage

I'm trying to create a page where people can see the highest rated article in the homepage but I don't know how to use likes to do so.

My post model

class Post(models.Model):
    title = models.CharField(max_length=225)
    post_image = models.ImageField(null=True, blank=True,  upload_to="images/")
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    body = models.TextField()
    post_date = models.DateField(auto_now_add=True)
    likes = models.ManyToManyField(User, related_name='blog_posts')

    def total_likes(self):
        return self.likes.count()

    def __str__(self):
        return self.title + ' | '  + str(self.author)

    def get_absolute_url(self):
        return reverse('post-detail', args=(str(self.id)),)

my views.py

def LikeView(request, pk):
    post = get_object_or_404(Post, id=request.POST.get('post_id'))
    liked = False
    if post.likes.filter(id=request.user.id).exists():
        post.likes.remove(request.user)
        liked = False
    else:
        post.likes.add(request.user)
        liked = True

    return HttpResponseRedirect(reverse('post-detail', args=[str(pk)]))

class HomeView(ListView):
    model = Post
    template_name = 'home.html'
   


class PostDetail(DetailView):
    model = Post
    template_name = 'post_detail.html'

    def get_context_data(self, *args, **kwargs):
        context = super(PostDetail, self).get_context_data()
        current_post = get_object_or_404(Post, id=self.kwargs['pk'])
        total_likes = current_post.total_likes()

        liked = False
        if current_post.likes.filter(id=self.request.user.id).exists():
            liked = True 


        context['total_likes'] = total_likes
        context['liked'] = liked 
        return context                    
    

Thanks in advance! ...................................................................................................

question from:https://stackoverflow.com/questions/65944103/django-order-by-highest-number-of-likes-in-homepage

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

As anoop quoted your HomeView will be:

class HomeView(ListView):
    queryset = Post.objects.annotate(like_count=Count('likes')).order_by('-like_count')
    template_name = 'home.html'
    context_object_name = 'post_list' # Providing a useful context_object_name is always a good idea

In your template:

{% for post in post_list %}    

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...