Django继承AbstractUser的自定义用户调用authenticate始终返回None如何解决
问题原因及解决方法
- 1. 未在配置中指定自定义用户模型
Django默认使用内置的auth.User做认证,自定义继承AbstractUser的用户类后,必须在项目settings.py中添加配置:
AUTH_USER_MODEL = 'conta.Usuario'
没加这个配置的话,authenticate方法会去默认用户表查数据,自然找不到你存在Usuario表的用户。
- 2. 密码存储方式错误
Django的authenticate方法会自动对传入的明文密码做哈希校验,如果你创建用户时直接给password字段赋值明文,数据库里存的不是Django标准格式的哈希密码,就会校验失败返回None。
正确的创建用户方式:
# 方法1:使用create_user方法 Usuario.objects.create_user(username="你的用户名", password="你的明文密码", nome="xxx", nascimento="xxxx-xx-xx") # 方法2:手动调用set_password加密 user = Usuario(username="你的用户名", nome="xxx", nascimento="xxxx-xx-xx") user.set_password("你的明文密码") user.save()
- 3. 重复定义父类已有的字段导致逻辑异常
AbstractUser本身已经内置了username和password字段,你不需要在自定义类中重复定义,重复定义会破坏Django自带的密码存储、校验相关的默认逻辑,直接删掉类中这两个字段的定义即可:
from django.db import models from django.contrib.auth.models import AbstractUser class Usuario(AbstractUser): nome = models.CharField(max_length = 255) nascimento = models.DateField()
修改后要重新生成迁移文件、执行迁移更新数据库结构。
- 4. 前端表单字段名不匹配
检查你的conta/tela_de_login.html中,用户名输入框的name属性是否为user,密码输入框的name属性是否为password,如果属性名不一致,request.POST.get()会拿到None,自然认证失败。
额外提示:你现有代码中
redirect('/admin')前缺少return,登录成功后不会正常跳转,修改为return redirect('/admin')即可。
内容的提问来源于stack exchange,提问作者vitorfranca
相关产品推荐
相关产品推荐

