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
相关产品推荐
相关产品推荐

