From 281ca887afe32a1b5e5b4d5990ef60a877185e40 Mon Sep 17 00:00:00 2001
From: zyy <1339568841@qq.com>
Date: Sun, 12 Oct 2025 17:53:18 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=B3=A8=E9=87=8A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/django-master/comments/admin.py | 129 ++++++++++++++++++++--------
1 file changed, 91 insertions(+), 38 deletions(-)
diff --git a/src/django-master/comments/admin.py b/src/django-master/comments/admin.py
index a814f3f..d3889c0 100644
--- a/src/django-master/comments/admin.py
+++ b/src/django-master/comments/admin.py
@@ -1,47 +1,100 @@
-from django.contrib import admin
-from django.urls import reverse
-from django.utils.html import format_html
-from django.utils.translation import gettext_lazy as _
+#django核心组件导入
+from django import forms# Django 表单处理模块
+from django.contrib.auth.admin import UserAdmin # Django 默认用户管理后台类
+from django.contrib.auth.forms import UserChangeForm # 用户信息修改表单基类
+from django.contrib.auth.forms import UsernameField# 用户名专用表单字段
+from django.utils.translation import gettext_lazy as _ # 国际化翻译函数
+# 本地应用导入
+# Register your models here.
+from .models import BlogUser # 导入自定义用户模型
-def disable_commentstatus(modeladmin, request, queryset):
- queryset.update(is_enable=False)
+class BlogUserCreationForm(forms.ModelForm):
+ """
+ 自定义用户创建表单(用于管理后台添加新用户)
+ 继承自 ModelForm专门处理 BlogUser 模型的创建
+ """
-def enable_commentstatus(modeladmin, request, queryset):
- queryset.update(is_enable=True)
+ # 定义密码输入字段(需要输入两次以确保一致)
+ 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字段)
-disable_commentstatus.short_description = _('Disable comments')
-enable_commentstatus.short_description = _('Enable comments')
+ def clean_password2(self):
+ """
+ 验证两次输入的密码是否一致
+ Django 表单验证方法,方法名必须以 clean_ 开头
+ """
+ # Check that the two password entries match
+ 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# 返回验证后的值
-class CommentAdmin(admin.ModelAdmin):
- list_per_page = 20
+ def save(self, commit=True):
+ """
+ 重写保存方法,在保存用户前处理密码哈希
+ """
+ # Save the provided password in hashed format
+ 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}# 指定用户名使用专用字段类型
+
+ def __init__(self, *args, **kwargs):
+ """
+ 表单初始化方法
+ 可以在这里对表单字段进行自定义设置
+ """
+ super().__init__(*args, **kwargs) # 调用父类初始化方法
+ # 可以在这里添加自定义逻辑,如修改字段属性等
+
+class BlogUserAdmin(UserAdmin):
+ """
+ 自定义用户管理后台配置
+ 继承自 Django 自带的 UserAdmin
+ """
+
+ # 指定使用的表单类
+ form = BlogUserChangeForm # 编辑用户时使用的表单
+ add_form = BlogUserCreationForm# 添加用户时使用的表单
+
+ # 管理后台列表页显示配置
list_display = (
- 'id',
- 'body',
- 'link_to_userinfo',
- 'link_to_article',
- 'is_enable',
- 'creation_time')
- list_display_links = ('id', 'body', 'is_enable')
- list_filter = ('is_enable',)
- exclude = ('creation_time', 'last_modify_time')
- actions = [disable_commentstatus, enable_commentstatus]
-
- def link_to_userinfo(self, obj):
- info = (obj.author._meta.app_label, obj.author._meta.model_name)
- link = reverse('admin:%s_%s_change' % info, args=(obj.author.id,))
- return format_html(
- u'%s' %
- (link, obj.author.nickname if obj.author.nickname else obj.author.email))
-
- def link_to_article(self, obj):
- info = (obj.article._meta.app_label, obj.article._meta.model_name)
- link = reverse('admin:%s_%s_change' % info, args=(obj.article.id,))
- return format_html(
- u'%s' % (link, obj.article.title))
-
- link_to_userinfo.short_description = _('User')
- link_to_article.short_description = _('Article')
+ 'id', # 用户ID
+ 'nickname', # 用户昵称
+ 'username',# 用户名
+ 'email', # 电子邮箱
+ 'last_login', # 最后登录时间
+ 'date_joined', # 注册时间
+ 'source')# 用户来源标记
+
+ # 设置哪些字段可以点击跳转到编辑页
+ list_display_links = ('id', 'username')
+
+ # 默认排序规则(按ID降序排列)
+ ordering = ('-id',)
+