如何在Django Admin Panel创建新用户时隐藏明文密码?
问题:Django Admin创建用户时密码明文显示
问题详情
在Admin Panel创建新用户并设置密码时,密码以明文形式显示,存在安全风险。
复现步骤
- 进入Admin Panel
- 选择创建新用户选项
- 输入新用户的密码
预期与实际行为
- 预期行为:密码输入框应隐藏内容,显示为圆点或星号(如
********) - 实际行为:密码以明文显示
当前admin.py代码
from django.contrib import admin from django.contrib.auth.hashers import make_password from user import models class UserAdmin(admin.ModelAdmin): """Define the admin pages for users.""" ordering = ['id'] list_display = ['id', 'email', 'name'] search_fields = ['id', 'name', 'email'] readonly_fields = ['last_login'] def save_model(self, request, obj, form, change): obj.password = make_password(obj.password) obj.user = request.user obj.save() # Register your models here. admin.site.register(models.User, UserAdmin)
解决方案
要让密码输入框隐藏内容,需自定义表单指定密码字段使用密码输入控件,修改后的代码如下:
from django.contrib import admin from django.contrib.auth.hashers import make_password from django import forms from user import models class UserAdminForm(forms.ModelForm): # 自定义密码字段,使用密码输入控件 password = forms.CharField(widget=forms.PasswordInput()) class Meta: model = models.User fields = '__all__' class UserAdmin(admin.ModelAdmin): """Define the admin pages for users.""" ordering = ['id'] list_display = ['id', 'email', 'name'] search_fields = ['id', 'name', 'email'] readonly_fields = ['last_login'] # 绑定自定义表单 form = UserAdminForm def save_model(self, request, obj, form, change): obj.password = make_password(obj.password) obj.user = request.user obj.save() # Register your models here. admin.site.register(models.User, UserAdmin)
说明
原代码未指定密码字段的输入控件,Django默认用普通文本框渲染。通过自定义ModelForm给密码字段设置PasswordInput widget,即可让输入框自动隐藏内容为星号/圆点。
若你的User模型继承自AbstractUser,也可直接使用Django内置的UserAdmin替代ModelAdmin,它默认已处理密码输入隐藏逻辑;若需自定义其他功能,上述方法更灵活。
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

