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生成迁移文件,需要先清理残留的迁移信息再重新生成,避免旧记录遗留导致报错:- 删除存放User模型的app下
migrations文件夹中,除了__init__.py之外的所有文件 - 清空当前使用的数据库(如果是Sqlite直接删除项目根目录的
db.sqlite3文件,其他数据库删除对应的库或者用户相关表) - 重新执行迁移命令:
python manage.py makemigrations python manage.py migrate
- 删除存放User模型的app下
补充说明
如果你的自定义模型有其他创建超级用户时必填的字段,可以把字段名加到REQUIRED_FIELDS列表中,比如需要填写手机号的话配置为REQUIRED_FIELDS = ['telephone']即可。
内容的提问来源于stack exchange,提问作者YaLeaura
相关产品推荐
相关产品推荐

