Django中authenticate()返回None问题排查求助
Django注册后authenticate返回None的问题修复
核心问题
你在创建用户时的密码处理逻辑错误,导致数据库存储的是明文密码,而Django的authenticate方法需要对比哈希后的密码,因此匹配失败:
- 直接通过
CustomUser(..., password=明文)实例化用户并保存,会把明文密码直接存入数据库,没有经过哈希处理。 - 后续调用
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
相关产品推荐
相关产品推荐

