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

Django中authenticate()返回None问题排查求助

Django注册后authenticate返回None的问题修复

核心问题

你在创建用户时的密码处理逻辑错误,导致数据库存储的是明文密码,而Django的authenticate方法需要对比哈希后的密码,因此匹配失败:

  1. 直接通过CustomUser(..., password=明文)实例化用户并保存,会把明文密码直接存入数据库,没有经过哈希处理。
  2. 后续调用set_password后没有再次执行save(),导致哈希后的密码未写入数据库。

修复方案

方案一:使用自定义用户管理器的create_user方法(推荐)

你的CustomUserManager已经实现了create_user方法,该方法会自动处理密码哈希和用户保存,直接调用即可:

# 替换views.py中创建用户的代码
form_data = user_signup_form.cleaned_data
# 用管理器方法创建用户,自动哈希密码并保存
repairman = CustomUser.objects.create_user(
    phone_number=form_data['phone_number'],
    password=form_data['password']
)

不需要再手动执行save()或set_password,管理器已经完成了这些操作。

方案二:修正手动创建用户的流程

如果你坚持手动实例化用户,需要确保密码哈希后再保存:

form_data = user_signup_form.cleaned_data
# 只传入phone_number,不直接赋值password
repairman = CustomUser(phone_number=form_data['phone_number'])
# 调用set_password哈希密码
repairman.set_password(form_data['password'])
# 保存用户到数据库
repairman.save()

删除原代码中repairman.save()之后的repairman.set_password(repairman.password)(这一步是错误的,因为此时repairman.password是明文,而且没有保存)。

额外优化建议

你的UserSignupForm继承自forms.Form,但又写了Meta类指定model和fields,这不会生效(forms.Form不支持Meta的这些属性),建议改成ModelForm更规范:

class UserSignupForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['phone_number'].label = "شماره تلفن"
        self.fields['phone_number'].widget.attrs['class'] = 'form-control input-bg-white l-field'
        self.fields['password'].label = "رمز عبور"
        self.fields['password'].widget.attrs['class'] = 'form-control input-bg-white l-field'
        self.fields['password'].widget.attrs['id'] = 'login-signup-pass'

    def clean_phone_number(self):
        phone_number = self.cleaned_data['phone_number']
        if CustomUser.objects.filter(phone_number=phone_number).exists():
            raise forms.ValidationError("این شماره تلفن قبلا در سایت ثبت شده است.", code="already-exist")
        return phone_number

    # 手动添加password字段,因为CustomUser的password是AbstractBaseUser的字段,不在显式fields里
    password = forms.CharField(widget=forms.PasswordInput)

    class Meta:
        model = CustomUser
        fields = ['phone_number']

内容的提问来源于stack exchange,提问作者parham mazahery

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:05:18