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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:21:28