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

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 降序排列