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

如何移除Django Admin中‘删除所选’操作的默认成功提示消息?

解决Django Admin中"Delete Selected"默认提示消息无法移除的问题

你当前的方法无效,核心原因是:Django Admin的批量删除流程里,默认的"Successfully deleted X persons."提示消息,是在你重写的delete_queryset方法执行之后,由Admin内置的批量删除视图(DeleteSelectedActionView)添加的。你在delete_queryset里删除的只是执行该方法前已存在的消息,根本碰不到后续添加的默认消息。

下面提供两种可行的解决方案:

方案一:重写批量删除视图,直接控制消息逻辑

通过自定义DeleteSelectedActionView,替换默认视图的消息处理逻辑,完全接管提示内容:

# store/admin.py
from .models import Person
from django.contrib import admin, messages
from django.contrib.admin.actions import delete_selected
from django.contrib.admin.views.main import DeleteSelectedActionView

class CustomDeleteSelectedActionView(DeleteSelectedActionView):
    def delete(self, request, *args, **kwargs):
        # 执行父类的删除逻辑,但跳过它的消息添加步骤
        response = super().delete(request, *args, **kwargs)
        
        # 清除所有已生成的消息(包括父类刚添加的默认消息)
        message_storage = messages.get_messages(request)
        message_storage.used = True  # 标记消息已处理,不会再显示
        
        # 添加自定义提示消息
        messages.success(request, "Deleted successfully!!")
        return response

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    def get_actions(self, request):
        actions = super().get_actions(request)
        
        # 替换默认的delete_selected动作,绑定自定义视图
        if 'delete_selected' in actions:
            actions['delete_selected'] = (
                delete_selected,
                'delete_selected',
                delete_selected.short_description
            )
            delete_selected.view_class = CustomDeleteSelectedActionView
        
        return actions

方案二:在列表视图中过滤并替换消息

通过重写Admin的changelist_view,在返回响应前过滤掉默认的删除消息,再添加自定义内容:

# store/admin.py
from .models import Person
from django.contrib import admin, messages

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    def changelist_view(self, request, extra_context=None):
        response = super().changelist_view(request, extra_context)
        
        # 判断是否是批量删除操作
        if request.method == 'POST' and '_delete' in request.POST:
            message_storage = messages.get_messages(request)
            retained_messages = []
            
            # 过滤掉默认的删除成功消息
            for msg in message_storage:
                if not msg.message.startswith("Successfully deleted"):
                    retained_messages.append(msg)
            
            # 清空原有消息存储
            message_storage.used = True
            
            # 重新添加保留的消息
            for msg in retained_messages:
                messages.add_message(request, msg.level, msg.message)
            
            # 添加自定义提示消息
            messages.success(request, "Deleted successfully!!")
        
        return response

    # 简化delete_queryset,只负责数据删除
    def delete_queryset(self, request, queryset):
        queryset.delete()

两种方案对比

  • 方案一:逻辑精准,直接针对批量删除视图,不受Django版本或语言设置影响,推荐使用。
  • 方案二:无需修改视图类,但依赖默认消息的文本格式,若Django版本更新或系统语言变更,可能需要调整匹配规则。

内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:05:27