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

Django中如何根据用户点赞状态动态显示评论区Like/Unlike按钮

你之前的写法无法生效有两个核心原因:

  1. Django模板语法不支持方法调用加括号,message.like_message.all()属于非法写法,正确的无参调用应该写为message.like_message.all
  2. 逻辑判断对象错误:你需要判断的是**当前登录用户request.user**是否在点赞列表中,而不是评论发布者message.username

下面是两种可行的实现方案:

方案1:视图层预处理(推荐)

优先选择该方案,通过预加载关联数据避免模板层产生N+1查询问题,性能更好。
修改视图代码,给每条评论新增is_liked标记:

def detail_post(request,_detail):
   postDetail = UserPosts.objects.get(pk = _detail)
   # prefetch_related预加载点赞关联数据,避免循环时重复查询数据库
   messages = UserMessages.objects.filter(post_id = postDetail.id).prefetch_related("like_message")
   current_user = request.user
   
   for msg in messages:
       # 未登录用户默认未点赞,可根据业务需求调整
       msg.is_liked = current_user.is_authenticated and current_user in msg.like_message.all()
   
   context = {
       "detail": postDetail,
       "messages": messages,
   }
   return render(request, "你对应的模板路径.html", context)

修改模板代码,直接使用预处理好的标记判断:

{% for message in messages %}
     {% if message.username_id == request.user.id %}
           <button class="btn btn-primary btn-sm" title="You can't like your message" disabled >Like</button>
     {% else %}
          {% if message.is_liked %}
               <button class="btn btn-primary btn-sm text-white btn-unlike {{ message.id }} " type="submit" name="usermessages_id"
               value="{{ message.id }}" id="{{ message.id }}"> Unlike </button>
          {% else %}
               <button class="btn btn-primary btn-sm text-white btn-like {{ message.id }} " type="submit" name="usermessages_id"
               value="{{ message.id }}" id="{{ message.id }}"> Like </button>
          {% endif %}
      {% endif %}
{% endfor %}

方案2:直接修正模板写法(适合评论量少的场景)

如果不想修改视图代码,也可以直接调整模板的判断逻辑,仅修正语法和判断对象即可:

{% for message in messages %}
     {% if message.username_id == request.user.id %}
           <button class="btn btn-primary btn-sm" title="You can't like your message" disabled >Like</button>
     {% else %}
          {% if request.user in message.like_message.all %}
               <button class="btn btn-primary btn-sm text-white btn-unlike {{ message.id }} " type="submit" name="usermessages_id"
               value="{{ message.id }}" id="{{ message.id }}"> Unlike </button>
          {% else %}
               <button class="btn btn-primary btn-sm text-white btn-like {{ message.id }} " type="submit" name="usermessages_id"
               value="{{ message.id }}" id="{{ message.id }}"> Like </button>
          {% endif %}
      {% endif %}
{% endfor %}

注意该方案在评论数量较多时会产生大量重复查询,性能低于方案1。

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

相关产品推荐
方舟 Agent Plan

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

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