Django自定义用户注册后无法登录问题求助
问题分析与解决方案
核心问题1:用户密码未正确哈希存储
你的CadastroForm是ModelForm,直接调用form.save()时,会将用户输入的明文密码直接存入数据库,而非通过set_password()方法做哈希处理。注册后能直接登录是因为login(request, user)直接使用用户对象登录,不需要密码验证;但退出后调用authenticate()时,系统会将输入的密码哈希后与数据库中的明文密码对比,自然验证失败。
解决方案:重写CadastroForm的save()方法,手动处理密码哈希:
# forms.py class CadastroForm(forms.ModelForm): password = forms.CharField(widget=forms.PasswordInput) class Meta: model = Cadastro fields = ("username", "email", "password") def save(self, commit=True): user = super().save(commit=False) # 对密码进行哈希处理 user.set_password(self.cleaned_data["password"]) if commit: user.save() return user
核心问题2:未配置自定义用户模型
Django默认使用自带的User模型做认证,如果你的项目用了自定义的Cadastro用户模型,必须在settings.py中明确指定,否则authenticate()会去默认的User表查找用户,而你的普通用户存在Cadastro表中,导致无法匹配。
解决方案:在项目根目录的settings.py中添加配置:
# settings.py AUTH_USER_MODEL = "base.Cadastro"
注意:添加此配置后,需重新生成数据库迁移文件并执行迁移(新项目直接迁移即可;已有项目需注意数据迁移的兼容问题)。
补充:LoginForm适配自定义用户模型
AuthenticationForm默认绑定Django自带的User模型,虽配置AUTH_USER_MODEL后大部分场景会自动适配,但为确保表单验证准确,可显式指定用户模型:
# forms.py from django.contrib.auth.forms import AuthenticationForm from django.contrib.auth import get_user_model User = get_user_model() class LoginForm(AuthenticationForm): username = forms.CharField( widget=forms.TextInput(attrs={"class": "form-control"}), required=True ) password = forms.CharField( widget=forms.PasswordInput(attrs={"class": "form-control"}), required=True ) class Meta: model = User
验证步骤
- 应用上述代码修改。
- 删除数据库中已有的普通用户(之前的密码为明文存储,无法正常验证)。
- 重新注册普通用户,检查数据库中
password字段是否为哈希值(而非明文)。 - 退出登录后尝试重新登录,即可正常验证并访问Profile页面。
内容的提问来源于stack exchange,提问作者Hévelin Lima
相关产品推荐
相关产品推荐

