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

点赞按钮可返回博客页面但后端不记录点赞,求排查错误

点赞功能无法后端记录的问题修复

核心错误点

  • 表单提交目标错误:你的表单action指向了文章详情页的viewblog路由,但点赞逻辑是在likepost路由对应的BlogLike视图里,导致点击按钮后根本没触发点赞处理代码。
  • 按钮类型拼写错误:按钮的type写成了sumbit,正确拼写是submit(虽然浏览器可能自动容错,但这是规范问题)。
  • 视图获取文章逻辑错误:BlogLike视图里用id=request.POST.get(slug)查询文章完全错误——URL已经传递了slug参数,直接用这个参数即可;而且你用文章的id字段去匹配POST里的slug值(字符串),类型不匹配,应该用slug=slug查询。
  • 视图未做请求校验且返回方式不当:没有判断请求方法是否为POST就执行点赞逻辑,而且用render返回页面会导致用户刷新时重复提交,应该用重定向。

修复后的代码

HTML模板

<form action="{% url 'likepost' blog.slug %}" method="POST">
    {% csrf_token %}
    <button class="btn btn-outline-secondary rounded-0 custom-button" id="like" type="submit">Like</button>
</form>
  • 修改action为点赞路由likepost,路由参数直接传递文章的slug
  • 修正type="submit"的拼写
  • 移除了多余的name="blog_id"和value,因为slug已经通过路由传递

视图函数

def BlogLike(request, slug):
    if request.method == 'POST':
        post = get_object_or_404(BlogPost, slug=slug)
        # 防止用户重复点赞
        if not post.likes.filter(id=request.user.id).exists():
            post.likes.add(request.user)
        # 重定向回文章详情页,避免重复提交
        return redirect('viewblog', slug=slug)
    # GET请求直接跳转回详情页
    return redirect('viewblog', slug=slug)
  • 增加POST请求判断,只在POST时处理点赞
  • 用URL参数里的slug正确查询对应的文章
  • 添加重复点赞的判断逻辑(可选,但很实用)
  • 用redirect替代render,避免刷新重复提交

路由(可选优化)

给点赞路由加上结尾斜杠,和详情页路由保持统一:

path('view-blog/<slug:slug>/', views.ViewBlog, name='viewblog'),
path('like/<slug:slug>/', views.BlogLike, name='likepost'),

内容的提问来源于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:06:34