You need to enable JavaScript to run this app. 使用Models.py新建用户表后Django登录页面无法完成身份认证
优惠活动
大模型
产品
解决方案
定价
更多

使用Models.py新建用户表后Django登录页面无法完成身份认证

问题核心原因

你遇到的登录校验失败问题是两个核心错误导致的:

  • Django自带的auth.authenticate()方法默认只查询Django内置的User表,你自定义的Register模型不在默认认证体系的查询范围内,无论输入的账号密码是否正确,该方法都会返回None
  • 你的Register模型存储的是明文密码,Django认证逻辑默认会校验哈希加密后的密码,明文密码永远无法通过校验

修复方案

方案1:复用Django自带用户体系(最推荐)

Django内置的User模型已经包含姓名、邮箱、密码、权限等常用字段,不需要自己定义用户模型,修改成本最低:

  1. 调整注册逻辑,用官方提供的create_user方法创建用户,自动完成密码哈希存储:
# 你的注册视图调整为如下逻辑
from django.contrib.auth.models import User
from django.contrib import auth

def register(request):
    if request.method == 'POST':
        first_name = request.POST['first_name']
        last_name = request.POST['last_name']
        email = request.POST['email']
        password = request.POST['password']
        # 这里用邮箱作为用户名,你也可以单独传username参数
        user = User.objects.create_user(
            username=email,
            email=email,
            password=password,
            first_name=first_name,
            last_name=last_name
        )
        user.save()
        return redirect('login')
    return render(request, 'register.html')
  1. 现有登录视图无需修改,auth.authenticate()会自动查询内置User表完成校验。如果后续需要扩展用户字段,直接继承AbstractUser扩展即可。

方案2:坚持使用自定义Register模型

需要手动接入Django认证体系,步骤如下:

  1. 先修改注册逻辑,存储密码前做哈希加密:
from django.contrib.auth.hashers import make_password

# 注册逻辑中存储密码部分调整
Register.objects.create(
    first_name=xxx,
    last_name=xxx,
    email=xxx,
    password=make_password(request.POST['password'])
)
  1. 在User应用下新建auth_backends.py自定义认证后端:
from django.contrib.auth.hashers import check_password
from .models import Register

class RegisterAuthBackend:
    def authenticate(self, request, email=None, password=None):
        try:
            user = Register.objects.get(email=email)
            if check_password(password, user.password):
                return user
            return None
        except Register.DoesNotExist:
            return None
    
    def get_user(self, user_id):
        try:
            return Register.objects.get(pk=user_id)
        except Register.DoesNotExist:
            return None
  1. 在项目settings.py中添加配置,启用自定义认证后端:
AUTHENTICATION_BACKENDS = [
    'User.auth_backends.RegisterAuthBackend',
    # 需要保留默认用户体系认证的话再加下面这行
    # 'django.contrib.auth.backends.ModelBackend',
]
  1. 给Register模型继承AbstractBaseUser和PermissionsMixin,补充Django认证需要的基础属性,避免auth.login()调用报错。

额外注意点

你当前登录页的邮箱输入框placeholder标注为Username,如果后续改用用户名而非邮箱登录,要对应调整视图中authenticate的传参。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 23:15:07