自定义Django User Model触发admin.E108错误,求解决方法
解决Django自定义用户模型的Admin E108错误
问题原因
你遇到的admin.E108错误,核心原因是你继承的BaseUserAdmin(也就是Django自带的UserAdmin)默认的list_display配置里包含了first_name和last_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代码,发现UserLoginForm的clean方法里有个笔误,会导致登录验证时报错:
# 错误写法 if not user.obj.check_password(password): # 正确写法(把user.obj改成user_obj) if not user_obj.check_password(password):
建议一起修正这个小问题,避免后续出现AttributeError。
补充说明
当你继承BaseUserAdmin时,它的很多配置都是针对Django默认的User模型设计的,所以自定义用户模型时,一定要显式重写那些依赖默认字段的属性(比如list_display、fieldsets等),确保只使用你的自定义模型中存在的字段。
内容的提问来源于stack exchange,提问作者Saleh




