I\'ve managed to disable the \"Delete selected\" action. Easy.
But a user can still click on an item and then there\'s the red Delete link at the bottom.
admin.site.disable_action('delete_selected')
From the docs
If you want to disable an specific one that isn't custom do this. In django 1.6.6 I had to extend get_actions
plus define has_delete_permission
. The has_delete_permission
solution does not get rid of the action from the dropdown for me:
class MyModelAdmin(admin.ModelAdmin):
....
def get_actions(self, request):
#Disable delete
actions = super(MyModelAdmin, self).get_actions(request)
del actions['delete_selected']
return actions
def has_delete_permission(self, request, obj=None):
#Disable delete
return False
Not including it in actions = ['your_custom_action']
, only works for the custom actions (defs) you have defined for that model. The solution AdminSite.disable_action('delete_selected')
, disables it for all models, so you would have to explicitly include them later per each modelAdmin
The solutions here are already nice, but I prefer to have it as a reusable mixin, like this:
class NoDeleteAdminMixin:
def has_delete_permission(self, request, obj=None):
return False
You can use this in all your admins where you want to prevent deletion like this:
class MyAdmin(NoDeleteAdminMixin, ModelAdmin):
...
Simple :)
class DeleteNotAllowedModelAdmin(admin.ModelAdmin):
# Other stuff here
def has_delete_permission(self, request, obj=None):
return False
Simply disable the yourapp.delete_yourmodel
permission for that user or the group to which (s)he belongs.
Well you probably are using:
AdminSite.disable_action('delete_selected')
For further control just implement your own admin and set its actions to whatever you need:
class MyModelAdmin(admin.ModelAdmin):
actions = ['whatever', 'actions']
Reference: http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#disabling-a-site-wide-action