自定义User模型下Django Admin编辑用户免密码的方案咨询
解决Django Admin编辑自定义User时密码必填且明文存储的问题
我来帮你搞定这个问题!你遇到的核心问题是自定义的UserAdmin继承了admin.ModelAdmin,而不是Django auth模块自带的UserAdmin——这个默认的UserAdmin已经帮我们封装好了密码字段的加密和编辑逻辑:比如编辑用户时无需重新输入密码,仅在创建新用户时要求填写,并且会自动加密存储密码。
解决方案步骤
- 导入Django官方的
UserAdmin类 - 让你的自定义
UserAdmin继承这个官方类,而非基础的ModelAdmin - 配置
fieldsets(编辑页面字段分组)和add_fieldsets(创建页面字段分组),把你新增的自定义字段加入到Admin页面中
修改后的admin.py代码
from django.contrib import admin from django.contrib.auth.admin import UserAdmin # 导入官方UserAdmin from .models import User class CustomUserAdmin(UserAdmin): # 保留你原本配置的列表展示字段 list_display = ["username", "email", "allow_emails", "accept_privacy_policy", "date_joined", "is_staff", "is_superuser"] # 扩展编辑页面的字段分组,将自定义字段加入 fieldsets = UserAdmin.fieldsets + ( ('自定义用户设置', {'fields': ('allow_emails', 'accept_privacy_policy')}), ) # 扩展创建新用户页面的字段分组,确保自定义字段能在创建时设置 add_fieldsets = UserAdmin.add_fieldsets + ( ('自定义用户设置', {'fields': ('email', 'allow_emails', 'accept_privacy_policy')}), ) # 注册自定义的UserAdmin admin.site.register(User, CustomUserAdmin)
为什么这样能解决问题?
- 继承官方
UserAdmin后,密码字段会自动使用Django内置的处理逻辑:- 编辑用户时,密码字段会显示为
********,无需重新填写,提交时不会覆盖原有加密密码 - 创建新用户时,密码字段为必填项,提交后会自动加密存储到数据库
- 编辑用户时,密码字段会显示为
- 通过
fieldsets和add_fieldsets,我们既保留了默认User模型的所有字段逻辑,又能在Admin页面中展示和编辑自己新增的字段
这样修改后,你就能在Admin后台编辑用户时无需填写密码,且密码始终保持加密存储状态啦!
内容的提问来源于stack exchange,提问作者Zuzana
相关产品推荐
相关产品推荐

