Python自定义用户模型基础疑问:删除用户代码中request.user写法的困惑
Python自定义用户模型基础疑问:删除用户代码中request.user写法的困惑
嗨,我来帮你理清楚这个疑问哈!
先看你的代码逻辑:你要删除当前登录的用户,最终实现的代码是能跑通的,但你对request.user.email这块有疑惑,咱们一步步拆解:
1. 为什么是request.user而不是request.the_user?
request.user是Django认证系统给你自动绑定好的!当你用@login_required装饰器时,Django会检查用户是否登录,一旦确认登录,就会把当前登录的那个用户实例挂载到request.user这个属性上——不管你用的是Django默认的User模型,还是自定义的继承了AbstractBaseUser的用户模型,这个规则都是一样的。- 而你定义的
the_user = get_user_model(),这只是拿到了用户模型的类(不是具体的用户实例),这个变量是你自己在视图里定义的,和request对象没有任何关联,request对象里根本不存在the_user这个属性,所以写request.the_user.email肯定会报错。
2. 额外的小优化
其实你的代码还可以更简洁:既然request.user已经是当前登录的用户实例了,完全不用再通过邮箱去过滤删除,直接写:
@login_required def del_user(request): request.user.delete() messages.warning(request, "bruker slettet.") return redirect("index")
这样既省去了重复查询数据库的步骤,代码也更直观~
关于AbstractBaseUser的疑问
你猜的没错!不管是默认User模型还是自定义用户模型,本质上都是基于AbstractBaseUser(或者它的子类)实现的,Django的认证系统就是依托这个基类来完成用户登录、会话管理等核心功能的,所以request.user才能正确获取到当前登录的用户对象,和你用的是哪种用户模型无关。
备注:内容来源于stack exchange,提问作者Lars
相关产品推荐
相关产品推荐

