You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django自定义用户模型后使用合法邮箱密码无法登录如何解决

问题排查与解决方案

核心问题:注册表单未处理密码加密,明文存储密码

你当前使用的RegisterForm是Django ModelForm,默认的save()方法会直接把表单提交的明文密码写入数据库的password字段。而Django的身份校验逻辑会将用户登录时输入的密码哈希后,再与数据库存储的哈希值对比,明文密码永远无法匹配校验规则,因此一直返回「用户名或密码无效」的错误。

修复方法:重写注册表单的save方法

在RegisterForm类中添加如下save方法,手动调用set_password对密码做哈希加密后再存储:

class RegisterForm(forms.ModelForm):
    # 原有代码保持不变
    ...

    # 新增save方法
    def save(self, commit=True):
        user = super().save(commit=False)
        # 对明文密码做哈希加密
        user.set_password(self.cleaned_data["password"])
        if commit:
            user.save()
        return user

其他需要检查的修正点

  • 登录视图中authenticate方法需要传入request参数:Django 1.10及以上版本要求authenticate第一个参数为请求对象,你当前的代码缺少该参数,可能导致校验失败,修改为:
    # 原有代码 user = authenticate(email=email, password=password)
    user = authenticate(request, email=email, password=password)
    
  • 清理历史测试数据:之前注册的用户密码都是明文存储,修复后需要删除这些历史用户,重新注册账号测试登录。
  • 确认认证后端配置:如果你修改过settings.py中的AUTHENTICATION_BACKENDS配置,确保你使用的认证后端支持以email作为用户名校验,默认的django.contrib.auth.backends.ModelBackend会自动适配你设置的USERNAME_FIELD = 'email',无需额外修改。

内容的提问来源于stack exchange,提问作者Ishan Khaire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 01:57:04