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

Django技术问题:如何在ListView中用get_context_data实现点赞判断?

解决ListView中实现点赞状态判断的问题

错误原因

你遇到的AttributeError是因为ListView没有self.object属性——ListView用来处理一组对象,对应的是self.object_list,而DetailView是单个对象详情页,才有self.object指向当前对象。直接照搬DetailView的写法自然会报错。

解决方案

下面提供两种可行的实现方式,推荐第二种以避免N+1查询问题:

方法1:在get_context_data中给每个帖子添加点赞状态

修改你的PostList类:

class PostList(generic.ListView):
    model = Post
    queryset = Post.objects.order_by('-created_on')
    template_name = 'blog/blog.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        current_user = self.request.user
        
        # 遍历每个帖子,设置liked状态
        for post in context['object_list']:
            if current_user.is_authenticated:
                post.liked = post.likes.filter(id=current_user.id).exists()
            else:
                post.liked = False
        return context

模板中遍历帖子时,直接调用每个帖子的liked属性:

{% for post in object_list %}
    <!-- 帖子其他内容 -->
    {% if post.liked %}
        <i class="fa-solid fa-thumbs-up"></i> 
    {% else %}
        <i class="fa-regular fa-thumbs-up"></i> 
    {% endif %}
{% endfor %}

方法2:用数据库注解(annotate)实现更高效的查询

这种方法通过一次数据库查询完成所有帖子的点赞状态标注,避免循环查询导致的性能问题:

from django.db.models import Exists, OuterRef

class PostList(generic.ListView):
    model = Post
    template_name = 'blog/blog.html'

    def get_queryset(self):
        current_user = self.request.user
        queryset = Post.objects.order_by('-created_on')
        
        if current_user.is_authenticated:
            # 用Exists子查询标注当前用户是否点赞该帖子
            queryset = queryset.annotate(
                liked=Exists(
                    current_user.likes.filter(id=OuterRef('id'))
                )
            )
        else:
            # 匿名用户默认未点赞
            queryset = queryset.annotate(liked=False)
        
        return queryset

模板写法和方法1完全一致,直接使用post.liked判断即可。

注意事项

  • 必须判断用户是否登录(current_user.is_authenticated),否则匿名用户访问时会抛出AnonymousUser相关的错误。
  • 方法2的性能更优,尤其是帖子数量较多时,推荐优先使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 09:45:27