# 导入Django表单模块 from django import forms # 导入Django默认用户管理类 from django.contrib.auth.admin import UserAdmin # 导入用户修改表单 from django.contrib.auth.forms import UserChangeForm # 导入用户名字段 from django.contrib.auth.forms import UsernameField # 导入国际化翻译函数 from django.utils.translation import gettext_lazy as _ # 注册模型到管理后台 # 导入自定义用户模型 from .models import BlogUser class BlogUserCreationForm(forms.ModelForm): """自定义用户创建表单,用于管理员后台创建用户""" # 密码字段1 - 输入密码 password1 = forms.CharField( label=_('password'), # 字段标签:密码 widget=forms.PasswordInput # 使用密码输入控件 ) # 密码字段2 - 确认密码 password2 = forms.CharField( label=_('Enter password again'), # 字段标签:再次输入密码 widget=forms.PasswordInput # 使用密码输入控件 ) class Meta: # 指定使用的模型 model = BlogUser # 表单包含的字段:仅邮箱 fields = ('email',) def clean_password2(self): """清理和验证密码确认字段""" # 从已清理数据中获取密码1 password1 = self.cleaned_data.get("password1") # 从已清理数据中获取密码2 password2 = self.cleaned_data.get("password2") # 检查两个密码是否存在且匹配 if password1 and password2 and password1 != password2: # 如果不匹配,抛出验证错误 raise forms.ValidationError(_("passwords do not match")) # 返回验证通过的密码2 return password2 def save(self, commit=True): """保存用户实例,处理密码哈希""" # 调用父类save方法但不立即提交到数据库 user = super().save(commit=False) # 使用Django的密码哈希方法设置密码 user.set_password(self.cleaned_data["password1"]) # 如果设置为立即提交 if commit: # 设置用户来源为管理员站点 user.source = 'adminsite' # 保存用户到数据库 user.save() # 返回用户实例 return user class BlogUserChangeForm(UserChangeForm): """自定义用户信息修改表单""" class Meta: # 指定使用的模型 model = BlogUser # 包含所有字段 fields = '__all__' # 字段类映射,用户名使用特定字段类 field_classes = {'username': UsernameField} def __init__(self, *args, **kwargs): """初始化表单""" # 调用父类初始化方法 super().__init__(*args, **kwargs) class BlogUserAdmin(UserAdmin): """自定义用户管理类,配置Django管理后台的用户界面""" # 指定修改用户时使用的表单 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',)