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