Django自定义AbstractUser模型后密码未加密、无法登录后台问题
Django 替换 AbstractUser 后问题解决方案
问题列表
- 后台管理面板字段排列无序
- 新建用户时密码以明文存储
- 用户登录后台提示「用户名或密码不匹配」
核心原因
自定义用户模型后,直接使用ModelAdmin无法继承Django默认用户管理的密码加密、字段排版等内置逻辑,必须继承UserAdmin来处理这些功能。
解决步骤及代码修改
1. 修改 admin.py,继承 UserAdmin
替换原有的ModelAdmin为UserAdmin,并配置自定义字段的显示规则:
from django.contrib import admin from django.contrib.auth.admin import UserAdmin # 导入UserAdmin from django.contrib.auth import get_user_model UserModel = get_user_model() @admin.register(UserModel) class UserAgentAdmin(UserAdmin): # 列表页显示字段 list_display = ( 'username', 'first_name', 'last_name', 'phone_number', 'email', ) list_filter = ( 'first_name', 'last_name', ) # 详情页字段分组排版,继承默认分组并添加自定义字段 fieldsets = UserAdmin.fieldsets + ( ('自定义信息', { 'fields': ('phone_number', 'profile_image', 'manage_properties') }), ) # 新建用户页面的字段配置,继承默认字段并补充自定义项 add_fieldsets = UserAdmin.add_fieldsets + ( ('自定义信息', { 'fields': ('first_name', 'last_name', 'phone_number') }), )
2. 修复模型必填字段问题(可选但建议)
原模型中profile_image未设置空值允许,新建用户时会因缺少头像无法保存,建议修改:
profile_image = models.ImageField( upload_to='photos_user_agent', blank=True, null=True, # 允许数据库字段为空 )
3. 重新执行迁移确保生效
python manage.py makemigrations python manage.py migrate
问题说明
- 字段排列无序:
UserAdmin预设了默认用户字段(用户名、密码、邮箱等)的分组和排版规则,继承后可保持有序,同时通过fieldsets添加自定义字段即可融入原有布局。 - 密码明文存储:
UserAdmin使用UserCreationForm作为新建用户表单,该表单会自动调用set_password()方法加密密码,而ModelAdmin无此逻辑。 - 登录失败:密码明文存储后,Django验证时会对输入密码加密再对比,导致与数据库中明文不匹配,解决密码加密问题后即可正常登录。
内容的提问来源于stack exchange,提问作者Basilio Cristov
相关产品推荐
相关产品推荐

