有没有办法覆盖 ModelAdmin 中的 delete_selected 方法但保持确认? [英] Is there a way to override the delete_selected method in ModelAdmin but keep confirmation?

查看:22
本文介绍了有没有办法覆盖 ModelAdmin 中的 delete_selected 方法但保持确认?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有:

class Person(admin.ModelAdmin):
    actions = ['delete_selected']
    def delete_selected(modeladmin, request, queryset):
        # Show confirmation page.
        for obj in queryset:
            obj.custom_delete()

我留下的评论是我苦苦挣扎的地方.我仍然想在执行自定义删除之前显示确认页面.

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.

您应该覆盖delete_selected.此操作是 定义为 [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()

一个 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆