Django删除用户报AnonymousUser无DB表示错误如何解决
问题根因
这个报错的核心原因是执行request.user.delete()时,request.user是未登录状态对应的AnonymousUser对象,该对象没有关联的数据库记录,Django原生不支持对其执行数据库删除操作。
方案未生效的原因
你导入了自定义的login_required装饰器,但没有将该装饰器挂载到profile_delete视图上,未登录用户依然可以正常请求这个接口,所以访问时request.user还是匿名用户。
另外你当前视图配置了@require_POST装饰器,会直接拦截所有GET请求返回405状态码,你视图里写的return render(request, 'users/delete.html')逻辑永远不会被触发,无法展示删除确认页。
修复方案
- 给视图加上登录校验装饰器,优先用Django原生的登录装饰器避免自定义装饰器的逻辑缺陷
- 移除冗余的POST请求判断(已经有
@require_POST做校验) - 删除用户后主动清理会话,避免残留登录态
如果不需要单独处理GET请求的确认页,修复后的代码如下:
from django.contrib.auth.decorators import login_required # 优先用Django原生登录校验装饰器 from django.views.decorators.http import require_POST from django.shortcuts import redirect from django.contrib.auth import logout @require_POST @login_required(login_url='/你的登录页路由地址') # 挂载登录校验装饰器 def profile_delete(request): user = request.user user.delete() logout(request) # 清理当前会话的登录状态 return redirect('users:login')
如果你需要保留删除确认页的展示逻辑,就把@require_POST装饰器去掉,保留原来的请求方法判断即可:
from django.contrib.auth.decorators import login_required from django.shortcuts import render, redirect from django.contrib.auth import logout @login_required(login_url='/你的登录页路由地址') def profile_delete(request): if request.method == 'POST': request.user.delete() logout(request) return redirect('users:login') return render(request, 'users/delete.html')
内容的提问来源于stack exchange,提问作者qwe qwe
相关产品推荐
相关产品推荐

