You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 12:27:05