Django自定义用户模型配置UserManager仍报username属性不存在错误
错误原因
- 你对
UserManager的作用存在认知偏差:用户管理器仅负责数据查询、创建等操作逻辑,不会为模型自动生成任何字段。username、first_name这类默认字段是AbstractUser基类预先定义的,你继承的AbstractBaseUser仅提供密码校验、登录态维护等核心鉴权能力,本身不内置username字段。 - 本次报错和用户鉴权逻辑无关,触发原因是Admin配置不合理:Django自带的
UserAdmin是为默认带username字段的官方User模型设计的,它的默认配置里list_display(后台列表展示字段)、ordering(排序规则)的首个字段都是username,你自定义的UserTable模型没有该字段,直接绑定UserAdmin就会触发系统的字段存在性校验报错。
解决方案
两种方案可选:
方案1:自定义Admin类适配你的用户模型(推荐,适配当前代码结构)
修改user/admin.py代码,重写UserAdmin的默认字段配置即可:
from django.contrib import admin from django.contrib.auth.admin import UserAdmin from .models import UserTable class CustomUserAdmin(UserAdmin): # 后台列表展示字段,替换默认的username为你的业务字段 list_display = ('email', 'name', 'phone', 'is_active', 'is_staff') # 排序规则替换为email ordering = ('email',) # 编辑用户页的字段配置 fieldsets = ( (None, {'fields': ('email', 'password')}), ('个人信息', {'fields': ('name', 'phone')}), ('权限配置', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}), ) # 新增用户页的字段配置 add_fieldsets = ( (None, { 'classes': ('wide',), 'fields': ('email', 'password1', 'password2', 'name', 'phone'), }), ) admin.site.register(UserTable, CustomUserAdmin)
方案2:切换用户模型基类
如果你需要username、first_name这类官方内置字段,可以把UserTable的继承类从AbstractBaseUser换成AbstractUser,再保留USERNAME_FIELD = 'email'的配置即可,该场景下可以直接使用默认的UserAdmin不需要额外修改。
内容的提问来源于stack exchange,提问作者Chau Loi
相关产品推荐
相关产品推荐

