Django应用中普通用户与超级用户能否使用相同邮箱或用户名?
Django应用中普通用户与超级用户能否使用相同邮箱或用户名?
不行的,你完全搞错了Django里“普通用户”和“超级用户”的本质关系——这俩根本不是两个独立的账户类型,而是同一个用户实体的不同权限状态而已。
咱们掰扯清楚核心逻辑:
你定义的CustomUser模型,所有用户(不管是注册的普通用户,还是用createsuperuser命令创建的超级用户),最终都存在同一个数据库表accounts_customuser里。超级用户只是把这个用户的is_superuser和is_staff字段设为True了,本质还是同一张表里的同一条记录。
你的模型里给email和username加了unique=True约束,这意味着整个表里这两个字段的值必须全局唯一——不管你是创建普通用户还是超级用户,都是往同一张表里插入数据,自然会触发“重复键”的完整性错误。Django根本不会“内部处理”这种情况,因为从设计逻辑来说,一个邮箱/用户名就该对应唯一的一个用户身份,拆分出两个同信息的账户反而会引发身份混淆的大问题。
那正确的操作方式是什么?
如果你想让已有的普通用户拥有超级权限,根本不用重新创建账户!直接修改现有用户的权限属性就行:
- 用Django Shell快速修改:
from accounts.models import CustomUser # 通过邮箱或用户名定位到目标用户 user = CustomUser.objects.get(email='test_user@test.com') # 开启超级用户与员工权限 user.is_superuser = True user.is_staff = True user.save()
- 或者更直观:登录Django后台管理,找到这个
test_user,勾选页面上的“Staff status”和“Superuser status”选项,保存后这个普通用户就变成超级用户了。
另外提个小优化:你的CustomUser模型里,REQUIRED_FIELDS包含了password,其实没必要——AbstractBaseUser默认就要求设置密码,把password从REQUIRED_FIELDS里移除不会影响任何功能。
内容来源于stack exchange
相关产品推荐
相关产品推荐

