问题与需求:在使用admin后台新增用户设置密码时,默认情况下密码是明文保存在数据库中,并没有加密,无法登录。代码和示例如下:
1,模型models.py
定义用户表UserProfile:
from django.db import models
from django.contrib.auth.models import AbstractUser
class UserProfile(AbstractUser):
nikename = models.CharField(max_length=20, verbose_name="昵称", null=True, blank=True)
mobile = models.CharField(max_length=11, verbose_name="手机号码", null=True, blank=True)
schoolName = models.CharField(max_length=30, verbose_name="学校名称", null=True, blank=True)
openid = models.CharField(max_length=100, verbose_name="用户的openid",blank=True, default="")
def __str__(self):
return self.username
class Meta:
verbose_name = "用户信息"
verbose_name_plural = verbose_name
2,admin.py
from django.contrib import admin
from .models import UserProfile
class UserProfileAdmin(admin.ModelAdmin):
list_display = ('username', 'openid')
list_display_links = ("username", "openid",)
search_fields = ("username", "openid")
list_filter = ("is_staff",)
readonly_fields = ("openid",)
list_per_page = 10
admin.site.register(UserProfile, UserProfileAdmin) # 用户
3,密码明文显示的问题
admin后台密码明文显示
mysql数据库的password也是没有加密的
4,解决密码明文显示
所以需要修改代码,继承UserAdmin
from django.contrib.auth.admin import UserAdmin
from .models import UserProfile
# UserAdmin继承自ModelAdmin
class UserProfileAdmin(UserAdmin):
list_display = ('username', 'openid')
list_display_links = ("username", "openid",)
search_fields = ("username", "openid")
list_filter = ("is_staff",)
readonly_fields = ("openid",)
list_per_page = 10
admin.site.register(UserProfile, UserProfileAdmin) # 用户
再看效果
新增页面:
新增完成之后查看页面:
5,注意事项
如果你实际上手操作或仔细一点的话你会发现一个问题:在继承UserAdmin后,无论是新增页面还是新增完成之后的查看页面,都会少了自己定义的模型字段,比如我这里少了UserProfile模型定义的openid,schoolName等等
这时需要添加fieldsets
from django.contrib.auth.admin import UserAdmin
from .models import UserProfile
class UserProfileAdmin(UserAdmin):
list_display = ('username', 'openid')
list_display_links = ("username", "openid",)
search_fields = ("username", "openid")
list_filter = ("is_staff",)
list_per_page = 10
fieldsets = (
(None, {'fields': ('username', 'password', 'first_name', 'last_name', 'email')}),
(gettext_lazy('个人信息'), {'fields': ('openid',)}), # 添加模型里的字段openid
(gettext_lazy('Permissions'), {'fields': ('is_superuser', 'is_staff', 'is_active',
'groups', 'user_permissions')}),
(gettext_lazy('Important dates'), {'fields': ('last_login', 'date_joined')}),
)
admin.site.register(UserProfile, UserProfileAdmin) # 用户
新增页面:
在设置完用户名和密码后的继续编辑页面:
查看页面:
到这里就已经解决了admin后台新增用户时的密码明文设置,和部分字段显示的问题了