Django LoginView无法验证用户问题排查求助
问题排查与解决方案
核心原因
- 密码未加密存储:注册时直接用
objects.create()创建用户,会把表单中的明文密码存入数据库,而Django的LoginView验证时会用哈希算法比对密码,明文与哈希值不匹配,导致登录失败。 - 重复定义password字段:
AbstractUser已内置password字段,你在CustomUser中重新定义会覆盖父类的字段逻辑,破坏Django的密码加密机制。
修复步骤
1. 修正CustomUser模型
删除自定义的password字段,依赖AbstractUser自带的字段及加密逻辑:
class CustomUser(AbstractUser): objects = UserManager() username = models.CharField( unique=True, max_length=150, error_messages={ 'unique': "Пользователь с таким ником уже есть"},) email = models.EmailField( 'почта', unique=True, blank=False) # 移除重复定义的password字段 first_name = models.CharField( 'имя', max_length=30, blank=True) second_name = models.CharField( 'фамилия', max_length=30, blank=True) birthday = models.DateField( 'день рождения', blank=True, null=True) USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['username'] class Meta: verbose_name = 'user' verbose_name_plural = 'users'
2. 修正注册视图
使用Django提供的create_user()方法创建用户,该方法会自动对密码进行哈希处理:
def registrations(request): form = RegistrationForm(request.POST or None) if request.method == 'POST' and form.is_valid(): user_data = form.cleaned_data # 单独提取密码,用create_user处理加密 password = user_data.pop('password') user = CustomUser.objects.create_user(password=password, **user_data) user.save() messages.success(request, 'Вы успешно зарегестрировались') context = { 'form': form, } return render(request, 'user/reg.html', context)
3. 配置自定义用户模型
在settings.py中添加配置,让Django认证系统识别你的CustomUser:
AUTH_USER_MODEL = '你的应用名.CustomUser'
(将你的应用名替换为实际存放CustomUser的应用名称,比如users.CustomUser)
4. 清理旧测试数据(可选)
此前注册的用户密码为明文存储,修复后这些旧用户仍无法登录,可清空用户表或重新创建测试用户。
验证修复
重启服务后注册新用户,使用该用户的邮箱和密码登录,LoginView即可正常验证通过。
内容的提问来源于stack exchange,提问作者Dima
相关产品推荐
相关产品推荐

