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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:06:04