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

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

验证步骤

  1. 应用上述代码修改。
  2. 删除数据库中已有的普通用户(之前的密码为明文存储,无法正常验证)。
  3. 重新注册普通用户,检查数据库中password字段是否为哈希值(而非明文)。
  4. 退出登录后尝试重新登录,即可正常验证并访问Profile页面。

内容的提问来源于stack exchange,提问作者Hévelin Lima

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:17:09