|
|
# 导入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',)
|