使用Models.py新建用户表后Django登录页面无法完成身份认证
问题核心原因
你遇到的登录校验失败问题是两个核心错误导致的:
- Django自带的
auth.authenticate()方法默认只查询Django内置的User表,你自定义的Register模型不在默认认证体系的查询范围内,无论输入的账号密码是否正确,该方法都会返回None - 你的
Register模型存储的是明文密码,Django认证逻辑默认会校验哈希加密后的密码,明文密码永远无法通过校验
修复方案
方案1:复用Django自带用户体系(最推荐)
Django内置的User模型已经包含姓名、邮箱、密码、权限等常用字段,不需要自己定义用户模型,修改成本最低:
- 调整注册逻辑,用官方提供的
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')
- 现有登录视图无需修改,
auth.authenticate()会自动查询内置User表完成校验。如果后续需要扩展用户字段,直接继承AbstractUser扩展即可。
方案2:坚持使用自定义Register模型
需要手动接入Django认证体系,步骤如下:
- 先修改注册逻辑,存储密码前做哈希加密:
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']) )
- 在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
- 在项目
settings.py中添加配置,启用自定义认证后端:
AUTHENTICATION_BACKENDS = [ 'User.auth_backends.RegisterAuthBackend', # 需要保留默认用户体系认证的话再加下面这行 # 'django.contrib.auth.backends.ModelBackend', ]
- 给
Register模型继承AbstractBaseUser和PermissionsMixin,补充Django认证需要的基础属性,避免auth.login()调用报错。
额外注意点
你当前登录页的邮箱输入框placeholder标注为Username,如果后续改用用户名而非邮箱登录,要对应调整视图中authenticate的传参。
内容的提问来源于stack exchange,提问作者Som
相关产品推荐
相关产品推荐

