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

Django博客点赞按钮点击报错:id字段预期数值却得到AnonymousUser求助

问题原因

  • 报错的核心是未登录状态下,request.user是Django自带的AnonymousUser匿名用户对象,不是合法的User模型实例,没有有效的id值,将其添加到和User关联的likes多对多字段时,Django无法读取到合法的用户id,就会触发类型错误。
  • 进入admin后台后功能恢复的原因:admin后台默认要求账号登录才能访问,登录后你的浏览器会存储合法的用户会话信息,此时再返回站点访问,request.user就变成了已登录的真实用户对象,所以点赞逻辑可以正常执行。

解决方法

1. 给点赞视图添加登录校验

Django自带login_required装饰器,可以限制只有已登录用户才能访问点赞接口,未登录用户调用时会自动跳转到登录页。同时补充重复点赞判断逻辑,避免同一个用户重复点赞同一篇文章。
修改后的视图代码:

# 先导入需要的依赖
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect

@login_required
def LikeView(request,pk):
    # 路由已经传递了文章pk,无需再从POST参数中读取,简化逻辑
    post = get_object_or_404(Post, id=pk)
    # 判断当前用户是否已经点赞
    if post.likes.filter(id=request.user.id).exists():
        # 已点赞则取消点赞
        post.likes.remove(request.user)
    else:
        # 未点赞则添加点赞
        post.likes.add(request.user)
    # 操作完成后跳转回文章详情页
    return redirect('post-detail', pk=pk)

2. 优化模板显示逻辑

修正模板中多余的逗号,同时添加登录状态判断,未登录用户直接看不到点赞按钮,避免无效点击:

<form action="{% url 'like_post' post.pk %}" method="POST">
    {% csrf_token %}
    {% if user.is_authenticated %}
    <button 
      type="submit" 
      name="post_id" 
      value="{{ post.id }}" 
      class="btn btn-primary btn-ms"
    >
        {% if post.likes.filter(id=user.id).exists %}
        取消点赞
        {% else %}
        点赞
        {% endif %}
        ({{ post.total_likes }})
    </button>
    {% else %}
    <span class="text-muted">登录后可参与点赞</span>
    {% endif %}
</form>

如果你的项目允许未登录用户点赞,需要修改点赞关联逻辑,比如用Cookie、IP或者设备标识来记录匿名用户的点赞行为,不能再直接关联User模型。

内容的提问来源于stack exchange,提问作者Osama Elzekred

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:27:05