Django中Admin核验用户表单后删除违规账号并通知的实现方法
全流程审核逻辑分步实现方案
一、业务环节的身份授权校验
- 基于Django自带的权限模型做能力扩展,避免自行造轮子:
- 如果使用自定义用户模型,直接在模型中新增授权标记字段,比如
is_submit_authorized = models.BooleanField(default=False, verbose_name="表单提交资格授权状态"),默认所有新注册用户都没有提交资格,需要管理员手动开启。 - 如果使用默认内置User模型,直接创建一张关联用户的资格表,通过外键绑定用户和授权状态即可。
- 如果使用自定义用户模型,直接在模型中新增授权标记字段,比如
- 编写自定义授权校验装饰器,叠加在所有需要进入后续业务环节的视图上,拦截未授权访问:
from django.http import HttpResponseForbidden def submit_authorization_required(view_func): def decorator(request, *args, **kwargs): # 超级管理员默认跳过校验 if request.user.is_superuser: return view_func(request, *args, **kwargs) if not getattr(request.user, "is_submit_authorized", False): return HttpResponseForbidden("当前账号暂不具备表单提交资格,请完成身份核验后再操作") return view_func(request, *args, **kwargs) return decorator - 把装饰器和基础登录校验
@login_required配合使用,挂在表单提交、个人提交记录查看这类核心业务视图上,形成双重校验。
二、管理员端全量表单查看能力
- 基于现有ModelForm的同步能力,在admin后台注册业务表单提交模型,配置审核人员的可见权限:
from django.contrib import admin from .models import BusinessFormSubmission @admin.register(BusinessFormSubmission) class SubmissionAdmin(admin.ModelAdmin): list_display = ["submit_user", "submit_time", "key_field_summary"] # 按角色过滤可见的提交记录,避免普通管理员看到全量数据 def get_queryset(self, request): queryset = super().get_queryset(request) # 仅超级管理员、"内容审核组"角色用户可查看全量提交 if request.user.is_superuser or request.user.groups.filter(name="内容审核组").exists(): return queryset return queryset.none() - 配置表单详情页的快捷跳转:在提交记录列表中直接显示关联的用户账号ID,点击即可跳转到对应用户的管理操作页,无需反复搜索定位。
三、违规用户删除+自动通知逻辑
- 自定义admin后台的批量删除操作,替代Django默认的用户删除行为,确保删除操作触发通知流程:
from django.contrib.auth.models import User from django.contrib.auth.admin import UserAdmin from django.core.mail import send_mail from django.conf import settings import logging logger = logging.getLogger(__name__) def delete_violation_users(modeladmin, request, queryset): # 遍历选中的待删除用户,逐户发送通知 for user in queryset: if not user.email: logger.warning(f"用户{user.username}未绑定有效邮箱,无法发送账号注销通知") continue send_mail( subject="平台账号注销通知", message="经平台管理员核验,你提交的业务表单存在错误、误导性无效内容,你的账号已被正式删除。后续如需重新使用平台服务,请提交合规有效的表单信息,如有疑问可联系平台客服。", from_email=settings.DEFAULT_FROM_EMAIL, recipient_list=[user.email], fail_silently=True ) # 执行批量删除操作 queryset.delete() # 配置操作在后台的显示名称 delete_violation_users.short_description = "删除选中违规用户,并向用户发送注销通知" # 重新注册User模型,把自定义操作挂载到后台界面 class CustomUserAdmin(UserAdmin): actions = [delete_violation_users] admin.site.unregister(User) admin.site.register(User, CustomUserAdmin) - 注意关联数据的兼容性配置:如果需要在用户被删除后保留历史提交记录作为审核凭证,把业务表单模型中关联用户的外键字段的
on_delete参数设置为models.SET_NULL,避免用户删除后所有历史记录被级联清空。
四、流程兜底校验
- 普通用户的提交记录视图必须增加用户身份过滤,所有查询语句添加
filter(submit_user=request.user)条件,避免出现越权查看他人提交内容的漏洞。 - 利用Django admin自带的操作二次确认弹窗,避免管理员误点删除造成批量账号误删。
- 通知发送失败时不要中断整个删除流程,把发送失败的日志留存下来,后续可以手动补发给用户。
内容的提问来源于stack exchange,提问作者Jesse
相关产品推荐
相关产品推荐

