from django import forms from django.contrib.auth.admin import UserAdmin from django.contrib.auth.forms import UserChangeForm, UsernameField from django.utils.translation import gettext_lazy as _ # 引入自定义用户模型 from .models import BlogUser class BlogUserCreationForm(forms.ModelForm): """ 后台创建用户表单 提供两个密码输入框,确保管理员在后台创建用户时输入的密码一致。 """ password1 = forms.CharField( label=_('password'), # 字段显示名,可翻译 widget=forms.PasswordInput # 密码输入框,输入时隐藏内容 ) password2 = forms.CharField( label=_('Enter password again'), # 再次输入密码 widget=forms.PasswordInput ) class Meta: model = BlogUser fields = ('email',) # 后台创建用户表单只要求输入 email def clean_password2(self): """ 验证两次输入的密码是否一致 """ 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): """ 保存用户,并将密码以哈希形式存储 """ user = super().save(commit=False) user.set_password(self.cleaned_data["password1"]) # 设置哈希密码 if commit: user.source = 'adminsite' # 标记用户来源为后台 user.save() return user class BlogUserChangeForm(UserChangeForm): """ 后台修改用户表单,继承 Django 自带 UserChangeForm """ class Meta: model = BlogUser fields = '__all__' # 显示模型的所有字段 field_classes = {'username': UsernameField} # 指定 username 字段类型 def __init__(self, *args, **kwargs): """ 可以在此处扩展初始化逻辑,目前直接调用父类初始化 """ super().__init__(*args, **kwargs) class BlogUserAdmin(UserAdmin): """ 自定义后台管理 BlogUser 的显示和表单配置 """ form = BlogUserChangeForm # 修改用户时使用的表单 add_form = BlogUserCreationForm # 创建用户时使用的表单 # 在列表页显示的字段 list_display = ( 'id', 'nickname', 'username', 'email', 'last_login', 'date_joined', 'source' ) list_display_links = ('id', 'username') # 哪些字段可以点击进入编辑页面 ordering = ('-id',) # 默认按 ID 降序排列