You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

自定义Django User Model触发admin.E108错误,求解决方法

解决Django自定义用户模型的Admin E108错误

问题原因

你遇到的admin.E108错误,核心原因是你继承的BaseUserAdmin(也就是Django自带的UserAdmin)默认的list_display配置里包含了first_namelast_name字段,但你的自定义MyUser模型并没有定义这两个字段,Admin后台在尝试渲染用户列表时找不到对应的属性,所以抛出了错误。另外你代码里还把list_display写成了List_display(首字母大写),这在Python里会被当成全新的属性,根本没覆盖父类的默认配置,这也是问题的导火索之一。

快速解决方案

在你自定义的UserAdmin类里,显式重写小写的list_display属性,只保留你的MyUser模型实际存在的字段即可。

修正后的admin.py代码

from django.contrib import admin
from django.contrib.auth.models import Group
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from .forms import UserCreationForm
from .models import MyUser

class UserAdmin(BaseUserAdmin):
    add_form = UserCreationForm
    # 重写list_display,只保留MyUser有的字段,注意是小写开头
    list_display = ('username', 'email', 'is_admin')
    list_filter = ('is_admin',)
    fieldsets = (
        (None, {'fields': ('username', 'email','password')}),
        ('Permissions', {'fields': ('is_admin',)}),
    )
    search_fields = ('username', 'email')
    ordering = ('username','email')
    filter_horizontal = ()

admin.site.register(MyUser, UserAdmin)
admin.site.unregister(Group)

额外的小问题修正(避免后续踩坑)

看了你的forms.py代码,发现UserLoginFormclean方法里有个笔误,会导致登录验证时报错:

# 错误写法
if not user.obj.check_password(password):
# 正确写法(把user.obj改成user_obj)
if not user_obj.check_password(password):

建议一起修正这个小问题,避免后续出现AttributeError

补充说明

当你继承BaseUserAdmin时,它的很多配置都是针对Django默认的User模型设计的,所以自定义用户模型时,一定要显式重写那些依赖默认字段的属性(比如list_displayfieldsets等),确保只使用你的自定义模型中存在的字段。

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

火山引擎 最新活动