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

