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.
85 lines
2.6 KiB
85 lines
2.6 KiB
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 降序排列
|