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.
Django/admin.py

103 lines
3.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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