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

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')逻辑永远不会被触发,无法展示删除确认页。

修复方案
  1. 给视图加上登录校验装饰器,优先用Django原生的登录装饰器避免自定义装饰器的逻辑缺陷
  2. 移除冗余的POST请求判断(已经有@require_POST做校验)
  3. 删除用户后主动清理会话,避免残留登录态

如果不需要单独处理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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:06:08