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

