配置自定义用户模型无法登录Django Admin后台如何解决
问题原因与修复方案
你的Admin后台登录报错,是自定义用户模型、管理器、配置存在多处不符合Django规范的问题,按以下步骤逐一修复即可:
- 修复模型类名与配置不匹配问题
你定义的模型类为小写开头的tgUser,既不符合Django模型大驼峰命名规范,也和settings中AUTH_USER_MODEL = "table.TgUser"的大写T类名不匹配,会导致用户模型引用异常。直接将模型类名修改为TgUser:class TgUser(AbstractBaseUser, PermissionsMixin): - 重写正确的UserManager逻辑
现有用户管理器存在两个致命问题:一是创建实例时传参不规范、不支持额外字段写入;二是创建超级用户时未设置is_superuser=True,会被PermissionsMixin的权限校验判定为无管理员权限。将原有UserManager替换为如下代码:class UserManager(BaseUserManager): def create_user(self, username, password=None, **extra_fields): user = self.model(username=username, **extra_fields) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, username, password, **extra_fields): extra_fields.setdefault("is_staff", True) extra_fields.setdefault("is_superuser", True) extra_fields.setdefault("is_admin", True) return self.create_user(username, password, **extra_fields) - 补全用户模型的权限校验方法
自定义用户模型必须实现has_perm、has_module_perms两个方法供Admin后台做权限判断,缺失这两个方法会直接导致权限校验不通过。在TgUser类中添加如下代码:
额外建议:将模型中名为def has_perm(self, perm, obj=None): return self.is_superuser or self.is_admin def has_module_perms(self, app_label): return self.is_superuser or self.is_adminid的CharField改名为tg_id,避免和Django模型内置的主键属性id产生命名冲突,减少隐性报错概率。 - 重置迁移与数据库
之前错误的模型定义已经生成了错误的表结构,必须清理后重新生成:- 删除
table应用下migrations文件夹中除__init__.py外的所有文件 - 删除本地数据库文件(使用默认sqlite时直接删除根目录下的
db.sqlite3) - 依次执行
python manage.py makemigrations、python manage.py migrate生成正确的表结构
- 删除
- 重新创建超级用户
执行命令python manage.py createsuperuser,按提示输入用户名、密码生成新的管理员账号,用该账号即可正常登录Admin后台。
注意:之前给
is_staff字段添加@property装饰器的操作是错误的,is_staff已经是模型字段,加装饰器会覆盖字段正常的读写逻辑,直接删除该装饰器即可。
内容的提问来源于stack exchange,提问作者Angela Riley
相关产品推荐
相关产品推荐

