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

Django点赞按钮数据库逻辑正常,无法切换Like/Unlike状态的问题

解决点赞按钮状态不切换的问题

问题根源:你模板里用的blog.liked字段根本不存在,所以模板判断永远走else分支,按钮一直显示“Like”。要实现状态切换,得在博客详情视图里计算当前用户的点赞状态,把这个状态传给模板,再用它来控制按钮显示。

步骤1:修改博客详情视图,传递点赞状态

找到你展示单篇博客的视图(比如叫ViewBlog),添加当前用户是否点赞的判断,并把状态传入模板上下文:

def ViewBlog(request, slug):
    blog = BlogPost.objects.get(slug=slug)
    # 仅当用户登录时判断是否点赞,未登录默认未点赞
    liked = blog.likes.filter(id=request.user.id).exists() if request.user.is_authenticated else False
    context = {
        'blog': blog,
        'liked': liked,  # 把点赞状态传给模板
        # 保留你原来的其他上下文变量
    }
    return render(request, '你的博客详情模板.html', context)

步骤2:修正模板中的判断逻辑

把HTML里的{% if blog.liked is True %}改成用视图传过来的liked变量:

<form action="{% url 'likepost' blog.slug %}" method="POST">
    {% csrf_token %}
    {% if liked %}
        <button class="btn btn-outline-secondary rounded-0 custom-button" id="like" type="submit" name="blog-id" value="{{ blog.slug }}">Unlike<i class="fa-solid fa-heart-crack"></i></button> - {{ blog.total_likes }} Likes
    {% else %}
        <button class="btn btn-outline-secondary rounded-0 custom-button" id="like" type="submit" name="blog-id" value="{{ blog.slug }}">Like<i class="fa-solid fa-heart"></i></button> - {{ blog.total_likes }} Likes
    {% endif %}
</form>

可选优化:简化点赞处理视图

你的BlogLike视图里,post_id从POST获取是冗余的,因为URL已经传入了slug参数,直接用它查询博客更简洁:

def BlogLike(request, slug):
    post = BlogPost.objects.get(slug=slug)
    if post.likes.filter(id=request.user.id).exists():
        post.likes.remove(request.user)
    else:
        post.likes.add(request.user)
    return HttpResponseRedirect(reverse('viewblog', args=[slug]))

这样修改后,用户点击点赞/取消点赞后,页面重定向回详情页,视图会重新计算点赞状态并传给模板,按钮就能正确切换显示“Like”或“Unlike”了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:27:45