如何阻止Django admin删除确认页显示所有待删除关联对象?
解决方案
核心思路是重写Django Admin的delete_selected默认action,替换默认的删除确认模板,跳过关联对象列表的渲染流程,具体操作如下:
步骤1:自定义快速删除action
在对应应用的admin.py文件中添加如下代码:
from django.contrib import admin from django.contrib.admin.actions import delete_selected as default_delete_selected def fast_delete_selected(modeladmin, request, queryset): # 临时替换确认页模板,执行后恢复原有配置避免影响其他模型 original_template = modeladmin.delete_selected_confirmation_template modeladmin.delete_selected_confirmation_template = "admin/fast_delete_confirmation.html" try: return default_delete_selected(modeladmin, request, queryset) finally: modeladmin.delete_selected_confirmation_template = original_template # 若需要全局替换所有模型的默认删除动作,打开下方两行注释即可 # admin.site.disable_action('delete_selected') # admin.site.add_action(fast_delete_selected, 'delete_selected')
步骤2:创建简化版删除确认模板
在项目templates目录下新建admin/fast_delete_confirmation.html文件,内容如下:
{% extends "admin/base_site.html" %} {% load i18n admin_urls %} {% block content %} <div class="module"> <p>{% blocktrans count counter=queryset.count %}你确定要删除选中的 {{ counter }} 个 {{ opts.verbose_name }} 对象吗?{% plural %}你确定要删除选中的 {{ counter }} 个 {{ opts.verbose_name_plural }} 对象吗?{% endblocktrans %}</p> <p>* 所有关联的对象会被同步删除,该操作不可撤销</p> <form action="" method="post">{% csrf_token %} {% for obj in queryset %} <input type="hidden" name="{{ action_checkbox_name }}" value="{{ obj.pk }}"> {% endfor %} <input type="hidden" name="action" value="delete_selected"> <input type="hidden" name="post" value="yes"> <div> <input type="submit" value="{% trans "是的,我确定" %}"> <a href="{% url opts|admin_urlname:'changelist' %}" class="button cancel-link">{% trans "取消,返回列表" %}</a> </div> </form> </div> {% endblock %}
步骤3:绑定到指定模型(可选)
如果不需要全局生效,只想给特定大数量级的模型使用快速删除,直接在对应ModelAdmin中指定action即可:
@admin.register(你的大数量模型) class YourModelAdmin(admin.ModelAdmin): actions = [fast_delete_selected]
适配Django 3.0.3的注意事项
- 所有修改均为扩展实现,无需改动Django源码,完美兼容3.0.x版本
- 原有删除权限校验、级联删除逻辑都会正常生效,不需要额外调整
- 若需要保留少量风险提示,可直接在模板中添加精简文字,无需渲染完整关联对象列表
内容的提问来源于stack exchange,提问作者MaDness
相关产品推荐
相关产品推荐

