如何移除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
相关产品推荐
相关产品推荐

