You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中统计用户点赞的post总数并传入DetailView上下文的实现咨询

解决方案

你在post模型的likes多对多字段中已经设置了related_name='blog_posts',这个参数就是用于从User侧反向查询关联的post数据,直接用这个属性就能拿到用户点赞过的所有帖子。

首先处理用户未登录的异常情况,避免访问request.user属性时报错,把你代码中#amount_of_user_likes = ????的位置替换为以下代码:

# 先判断用户是否登录,未登录时点赞总数默认返回0
if self.request.user.is_authenticated:
    amount_of_user_likes = self.request.user.blog_posts.count()
else:
    amount_of_user_likes = 0

原理解释

  • Django多对多字段的related_name参数作用是定义反向关联的查询属性名,你这里设置为blog_posts,就代表任意User实例可以通过实例.blog_posts拿到该用户点赞过的所有post对象的查询集
  • 调用查询集的.count()方法即可直接统计总数,不需要额外写复杂的查询逻辑

修改后的完整get_context_data代码参考:

def get_context_data(self,*args,**kwargs):
    cat_menu = Category.objects.all()
    # 统计当前用户点赞过的帖子总数
    if self.request.user.is_authenticated:
        amount_of_user_likes = self.request.user.blog_posts.count()
    else:
        amount_of_user_likes = 0

    context = super(ArticleDetailView,self).get_context_data(*args,**kwargs)
    stuff=get_object_or_404(post,id=self.kwargs['pk'])

    total_likes= stuff.total_likes()

    liked = False
    if self.request.user.is_authenticated and stuff.likes.filter(id=self.request.user.id).exists():
        liked = True
    context['cat_menu'] = cat_menu
    context['total_likes']=total_likes
    context['liked'] = liked
    context['amount_of_user_likes']=amount_of_user_likes
    return context

内容的提问来源于stack exchange,提问作者qua

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:36:03