您可以使用来自Django 2.1的delete_queryset用于批量删除对象,使用delete_model用于单次删除。这两种方法都会在删除对象之前处理一些事情。
ModelAdmin.delete_queryset(请求,查询集)
这是Django 2.1发行说明中关于delete_queryset的解释。
为 delete_queryset() 方法提供了 HttpRequest 和要删除的对象的 QuerySet。重写此方法,自定义“删除选定对象”的删除过程</p>
我们来看看delete_queryset是做什么的,可以覆盖admin。ModelAdmin类以这种方式通过包含delete_queryset函数。在这里,您将获得对象列表,queryset.delete()
意味着一次删除所有对象,或者您可以添加一个循环来逐个删除。
def delete_queryset(self, request, queryset):
print('==========================delete_queryset==========================')
print(queryset)
"""
you can do anything here BEFORE deleting the object(s)
"""
queryset.delete()
"""
you can do anything here AFTER deleting the object(s)
"""
print('==========================delete_queryset==========================')
所以我要从“选择窗口”中删除 5 个对象,这就是这 5 个对象。

然后你会像这样重定向到确认页面,

请记住“是的,我确定”按钮,稍后我会解释它。当您单击该按钮时,您将在删除这 5 个对象后看到下图。

这是终端输出,

因此,您将获得这 5 个对象作为 QuerySet 列表,在删除之前,您可以在评论区做任何您想做的事情。
ModelAdmin.delete_model(request, obj)
这是关于delete_model的解释。
delete_model 方法被赋予了 HttpRequest 和一个模型实例。覆盖此方法允许执行删除前或删除后操作。调用 super().delete_model() 以使用 Model.delete() 删除对象。
我们看看delete_model做了什么,可以覆盖admin。ModelAdmin类以这种方式通过包含delete_model函数。
actions = ['delete_model']
def delete_model(self, request, obj):
print('============================delete_model============================')
print(obj)
"""
you can do anything here BEFORE deleting the object
"""
obj.delete()
"""
you can do anything here AFTER deleting the object
"""
print('============================delete_model============================')
我只需单击我的第 6 个对象即可从“更改窗口”中删除。

还有另一个删除按钮,当您单击它时,您会看到我们之前看到的窗口。

单击“是,我确定”按钮删除单个对象。您将看到以下窗口,其中包含有关已删除对象的通知。

这是终端输出,

因此,您将获得选定的对象作为单个 QuerySet 并且在删除之前,您可以在评论区域中做任何您想做的事情。
最后的结论是,您可以使用delete_queryset和delete_model在 Django 管理站点中单击“选择窗口”或“更改窗口”中的“是的,我确定”按钮来处理删除事件。这样我们就不需要处理像django.db.models.signals.pre_delete或django.db.models.signals.post_delete这样的信号了。
这是完整的代码,
from django.contrib import admin
from . import models
class AdminInfo(admin.ModelAdmin):
model = models.AdminInfo
actions = ['delete_model']
def delete_queryset(self, request, queryset):
print('========================delete_queryset========================')
print(queryset)
"""
you can do anything here BEFORE deleting the object(s)
"""
queryset.delete()
"""
you can do anything here AFTER deleting the object(s)
"""
print('========================delete_queryset========================')
def delete_model(self, request, obj):
print('==========================delete_model==========================')
print(obj)
"""
you can do anything here BEFORE deleting the object
"""
obj.delete()
"""
you can do anything here AFTER deleting the object
"""
print('==========================delete_model==========================')
admin.site.register(models.AdminInfo, AdminInfo)