Django自定义用户模型登录异常:已配置AUTH_USER_MODEL但登录失效
自定义用户登录功能失效的可落地修复步骤
1. 优先修复代码中的显性语法、逻辑错误
- 登录视图存在变量名错配:认证逻辑拿到的返回值变量是
userauth,但后续调用login()方法时传入的是未定义的user1,会直接触发NameError,需修正为login(response, userauth)。 - 代码缩进层级不匹配:现有视图逻辑中POST分支的代码没有做Python要求的统一缩进,自定义模型类内
USERNAME_FIELD = 'username'行的缩进也和类内其他成员错位,会直接触发语法解析报错,需逐行校准缩进。 - 视图渲染逻辑冗余:GET分支已经初始化了表单对象
form = AuthenticationForm(),但最终渲染模板时又重新实例化了一个空白表单,会导致表单校验失败时用户已输入的内容无法回显,需把上下文参数改成{"form2": form}复用已初始化的对象。
2. 补全自定义用户体系缺失的核心依赖
- 启用被注释的自定义用户管理器:你当前的
NewUser模型直接继承AbstractBaseUser但没有绑定专门的用户管理器,是导致认证流程无法正常关联的核心原因。需先按Django要求补写完整的CustomAccountManager,再在模型内绑定:
class CustomAccountManager(BaseUserManager): def create_user(self, username, firstName, lastName, password, **other_fields): if not username: raise ValueError(_('必须设置用户名')) user = self.model( username=username, firstName=firstName, lastName=lastName, **other_fields ) # 必须调用set_password做密码哈希加密,不能直接存明文 user.set_password(password) user.save() return user def create_superuser(self, username, firstName, lastName, password, **other_fields): other_fields.setdefault('is_staff', True) other_fields.setdefault('is_superuser', True) other_fields.setdefault('is_active', True) return self.create_user(username, firstName, lastName, password, **other_fields) class NewUser(AbstractBaseUser, PermissionsMixin): # ... 已定义的所有字段 objects = CustomAccountManager() USERNAME_FIELD = 'username' REQUIRED_FIELDS = ['firstName', 'lastName']
- 校验注册逻辑的密码处理:如果你的注册流程是直接通过
NewUser.objects.create(username=xxx, password=xxx)存库,没有调用set_password()做哈希加密,就算用户对象存在,authenticate()方法也会因为密码哈希不匹配返回None。
3. 冗余代码与配置校验优化
- 你手写的
AuthenticationForm属于重复造轮子,直接导入Django内置的认证表单即可:from django.contrib.auth.forms import AuthenticationForm,内置表单已经自动适配你配置的AUTH_USER_MODEL,内置了用户存在性校验、密码比对的全套逻辑,不需要自己写空壳表单。 - 确认数据库迁移顺序:如果你是在已经执行过初始数据库迁移之后,才添加的
AUTH_USER_MODEL = 'usuarios.NewUser'配置,需要删除原有数据库、清空应用下的migrations目录(保留__init__.py),重新执行makemigrations和migrate,否则用户表的关联外键会出现配置错乱。
内容的提问来源于stack exchange,提问作者OSCAR ANDRE PAREDEZ URIZAR
相关产品推荐
相关产品推荐

