Django中如何根据用户点赞状态动态显示评论区Like/Unlike按钮
你之前的写法无法生效有两个核心原因:
- Django模板语法不支持方法调用加括号,
message.like_message.all()属于非法写法,正确的无参调用应该写为message.like_message.all - 逻辑判断对象错误:你需要判断的是**当前登录用户
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
相关产品推荐
相关产品推荐

