You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Django/doc/accounts/admin.py

88 lines
3.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 导入Django表单基类
from django import forms
# 导入Django内置的用户管理员类用于扩展自定义用户的admin配置
from django.contrib.auth.admin import UserAdmin
# 导入Django内置的用户修改表单用于扩展自定义用户的修改表单
from django.contrib.auth.forms import UserChangeForm
# 导入Django内置的用户名字段类用于自定义用户名字段验证
from django.contrib.auth.forms import UsernameField
# 导入翻译工具,用于实现字段名称的国际化
from django.utils.translation import gettext_lazy as _
# 注册模型时需要导入自定义的用户模型
from .models import BlogUser
class BlogUserCreationForm(forms.ModelForm):
"""自定义用户创建表单用于在admin站点添加新用户时使用"""
# 密码字段,使用密码输入框(输入内容隐藏),标签支持国际化
password1 = forms.CharField(label=_('password'), widget=forms.PasswordInput)
# 确认密码字段,用于验证两次输入的密码是否一致
password2 = forms.CharField(label=_('Enter password again'), widget=forms.PasswordInput)
class Meta:
# 关联的模型为自定义的BlogUser
model = BlogUser
# 创建用户时需要填写的字段这里仅指定email其他字段可默认或后续补充
fields = ('email',)
def clean_password2(self):
"""验证两次输入的密码是否一致"""
# 获取清洗后的密码1和密码2
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
# 如果两次密码都存在且不一致,抛出验证错误
if password1 and password2 and password1 != password2:
raise forms.ValidationError(_("passwords do not match"))
return password2
def save(self, commit=True):
"""保存用户,将密码加密处理,并设置创建来源"""
# 调用父类的save方法先不提交到数据库commit=False
user = super().save(commit=False)
# 对密码进行加密处理Django内置的密码哈希方法
user.set_password(self.cleaned_data["password1"])
# 如果需要提交到数据库
if commit:
# 设置用户的创建来源为'adminsite'表示通过admin站点创建
user.source = 'adminsite'
user.save()
return user
class BlogUserChangeForm(UserChangeForm):
"""自定义用户修改表单用于在admin站点编辑用户信息时使用"""
class Meta:
# 关联的模型为BlogUser
model = BlogUser
# 显示所有字段(可根据需要指定具体字段)
fields = '__all__'
# 指定用户名字段的处理类为UsernameField提供内置验证
field_classes = {'username': UsernameField}
def __init__(self, *args, **kwargs):
"""初始化方法,调用父类的初始化逻辑"""
super().__init__(*args, **kwargs)
class BlogUserAdmin(UserAdmin):
"""自定义用户管理员类用于在admin站点配置BlogUser的展示和操作"""
# 指定修改用户时使用的表单
form = BlogUserChangeForm
# 指定添加用户时使用的表单
add_form = BlogUserCreationForm
# 列表页展示的字段
list_display = (
'id', # 用户ID
'nickname', # 昵称
'username', # 用户名
'email', # 邮箱
'last_login', # 最后登录时间
'date_joined', # 注册时间
'source' # 创建来源
)
# 列表页中可点击跳转详情页的字段
list_display_links = ('id', 'username')
# 列表页的排序方式按ID降序即最新创建的用户在前
ordering = ('-id',)