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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:39:03