点赞按钮可返回博客页面但后端不记录点赞,求排查错误
点赞功能无法后端记录的问题修复
核心错误点
- 表单提交目标错误:你的表单
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
相关产品推荐
相关产品推荐

