有没有一种方法可以覆盖ModelAdmin中的delete_selected方法,但要进行确认? [英] Is there a way to override the delete_selected method in ModelAdmin but keep confirmation?
问题描述
我有:
class Person(admin.ModelAdmin):
actions = ['delete_selected']
def delete_selected(modeladmin, request, queryset):
# Show confirmation page.
for obj in queryset:
obj.custom_delete()
该注释I剩下的就是我在努力的地方。我仍然想在执行自定义删除之前显示确认页面。
That comment I left there is where I'm struggling. I still want to show the confirmation page before I perform my custom delete.
推荐答案
简短答案:您应该覆盖 delete_queryset
[Django-doc] ,因为这封装了删除对象的真实逻辑。
Short answer: you should override delete_queryset
[Django-doc], since this encapsulates the real logic to remove the objects.
您应该不覆盖删除选定的
。此操作是定义为[ GitHub] :
You should not override delete_selected
. This action is defined like [GitHub]:
def delete_selected(modeladmin, request, queryset):
# ...
# Populate deletable_objects, a data structure of all related objects that
# will also be deleted.
deletable_objects, model_count, perms_needed, protected = modeladmin.get_deleted_objects(queryset, request)
# The user has already confirmed the deletion.
# Do the deletion and return None to display the change list view again.
if request.POST.get('post') and not protected:
if perms_needed:
raise PermissionDenied
n = queryset.count()
if n:
for obj in queryset:
obj_display = str(obj)
modeladmin.log_deletion(request, obj, obj_display)
modeladmin.delete_queryset(request, queryset)
modeladmin.message_user(request, _("Successfully deleted %(count)d %(items)s.") % {
"count": n, "items": model_ngettext(modeladmin.opts, n)
}, messages.SUCCESS)
# Return None to display the change list page again.
return None
# ...
context = {
# ...
}
request.current_app = modeladmin.admin_site.name
# Display the confirmation page
return TemplateResponse(request, modeladmin.delete_selected_confirmation_template or [
"admin/%s/%s/delete_selected_confirmation.html" % (app_label, opts.model_name),
"admin/%s/delete_selected_confirmation.html" % app_label,
"admin/delete_selected_confirmation.html"
], context)
delete_selected.allowed_permissions = ('delete',)
delete_selected.short_description = gettext_lazy("Delete selected %(verbose_name_plural)s")
此处的关键部分是该操作将执行适当的检查,但删除操作本身是通过调用完成的:
The key part here is that this action will perform the proper checks, but the deletion itself is done through a call:
modeladmin.delete_queryset(request, queryset)
因此足以覆盖 delete_queryset
而是使用:
So it is sufficient to override delete_queryset
instead, with:
class PersonAdmin(admin.ModelAdmin):
actions = ['delete_selected']
def delete_queryset(self, request, queryset):
for obj in queryset:
obj.custom_delete()
A ModelAdmin
具有 delete_queryset
[GitHub] :
A ModelAdmin
has a standard implementation for delete_queryset
[GitHub]:
class ModelAdmin(BaseModelAdmin):
# ...
def delete_queryset(self, request, queryset):
"""Given a queryset, delete it from the database."""
queryset.delete()
这篇关于有没有一种方法可以覆盖ModelAdmin中的delete_selected方法,但要进行确认?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!