You need to enable JavaScript to run this app. Django自定义AbstractUser时设置username为None报FieldDoesNotExist错误如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Django自定义AbstractUser时设置username为None报FieldDoesNotExist错误如何解决

Django自定义AbstractUser移除username字段报错解决方案

你遇到的django.core.exceptions.FieldDoesNotExist: User has no field named 'username'报错,核心原因是继承AbstractUser移除username字段后,没有告知Django使用新的字段作为用户唯一标识,同时缺少对应配置导致默认逻辑仍在调用username字段。

解决步骤

  • 第一步:完善自定义User模型配置
    在User类中添加USERNAME_FIELD配置,明确告知Django使用email作为用户的唯一登录字段,同时绑定你自定义的UserManager,修正后的代码如下:
    class User(AbstractUser):
        username = None
        email = models.EmailField('email adress', unique=True)
        telephone = models.CharField(max_length=20)
        
        # 新增以下两行配置
        USERNAME_FIELD = 'email'
        objects = UserManager()
        
        REQUIRED_FIELDS = []
    
    USERNAME_FIELD的取值必须是模型中设置了unique=True的字段,对应你这里的email字段。
  • 第二步:配置项目全局用户模型
    打开项目的settings.py文件,添加如下配置,指定Django使用你自定义的用户模型:
    AUTH_USER_MODEL = "你的应用名.User"
    
    注意把你的应用名替换为存放User模型的app的实际名称。
  • 第三步:清理旧迁移记录(如果已生成过迁移)
    如果你在添加上述配置之前已经执行过makemigrations生成迁移文件,需要先清理残留的迁移信息再重新生成,避免旧记录遗留导致报错:
    1. 删除存放User模型的app下migrations文件夹中,除了__init__.py之外的所有文件
    2. 清空当前使用的数据库(如果是Sqlite直接删除项目根目录的db.sqlite3文件,其他数据库删除对应的库或者用户相关表)
    3. 重新执行迁移命令:
      python manage.py makemigrations
      python manage.py migrate
      

补充说明

如果你的自定义模型有其他创建超级用户时必填的字段,可以把字段名加到REQUIRED_FIELDS列表中,比如需要填写手机号的话配置为REQUIRED_FIELDS = ['telephone']即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 04:57:00