The default “delete selected” admin action in Django

后端 未结 8 1617
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-14 09:24

How can I remove or change the verbose name of the default admin action \"delete selected X item\" in the Django admin panel?

相关标签:
8条回答
  • 2020-12-14 09:50

    Not sure if this sort of monkey-patching is a good idea, but shoving this in one of my admin.py works for me:

    from django.contrib.admin.actions import delete_selected
    delete_selected.short_description = u'How\'s this for a name?'
    

    This will change the verbose name for all your admin sites. If you want to change it just for one particular model's admin, I think you'll need to write a custom admin action.

    Tested with Django version 1.1:

    >>> import django
    >>> django.VERSION
    (1, 1, 0, 'beta', 1)
    
    0 讨论(0)
  • 2020-12-14 09:54

    http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#disabling-a-site-wide-action

    0 讨论(0)
  • 2020-12-14 10:00

    Alternatively to Googol's solution, and by waiting for delete_model() to be implemented in current Django version , I suggest the following code.

    It disables the default delete action for current AdminForm only.

    class FlowAdmin(admin.ModelAdmin):
        actions = ['delete_model']
    
        def get_actions(self, request):
            actions = super(MyModelAdmin, self).get_actions(request)
            del actions['delete_selected']
            return actions
    
        def delete_model(self, request, obj):
            for o in obj.all():
                o.delete()
        delete_model.short_description = 'Delete flow'
    
    admin.site.register(Flow, FlowAdmin)
    
    0 讨论(0)
  • 2020-12-14 10:01

    You can disable the action from appearing with this code.

    from django.contrib import admin
    admin.site.disable_action('delete_selected')
    

    If you chose, you could then restore it on individual models with this:

    class FooAdmin(admin.ModelAdmin):
        actions = ['my_action', 'my_other_action', admin.actions.delete_selected]
    
    0 讨论(0)
  • 2020-12-14 10:06
    from django.contrib.admin import sites
    from django.contrib.admin.actions import delete_selected
    
    
    class AdminSite(sites.AdminSite):
        """
        Represents the administration, where only authorized users have access.
        """
        def __init__(self, *args, **kwargs):
            super(AdminSite, self).__init__(*args, **kwargs)
            self.disable_action('delete_selected')
            self.add_action(self._delete_selected, 'delete_selected')
    
        @staticmethod
        def _delete_selected(modeladmin, request, queryset):
            _delete_qs = queryset.delete
    
            def delete():
                for obj in queryset:
                    modeladmin.delete_model(request, obj)
                _delete_qs()
    
            queryset.delete = delete
            return delete_selected(modeladmin, request, queryset)
    
    0 讨论(0)
  • 2020-12-14 10:06
    class FooAdmin(sites.AdminSite):
            not_deleted = ['value1', 'value2']
            actions = ['delete_selected_values']
    
        def delete_selected_values(self, request, queryset):
            # my custom logic
            exist = queryset.filter(value__in=self.not_deleted).exists()
            if exist:
                error_message = "Error"
                self.message_user(request, error_message, level=messages.ERROR)
            else:
                delete_action = super().get_action('delete_selected')[0]
                return delete_action(self, request, queryset)
        delete_selected_values.short_description = 'delete selected'
    
    admin.site.register(Foo, FooAdmin)
    
    0 讨论(0)
提交回复
热议问题