I want to remove the Delete button from django admin page as shown below.

- 22,221
- 10
- 124
- 129

- 115
- 2
- 7
-
Show the admin code for this. – sp1rs Jul 09 '19 at 03:22
-
Possible duplicate of [In Django Admin how do I disable the Delete link](https://stackoverflow.com/questions/4043843/in-django-admin-how-do-i-disable-the-delete-link) – RonanFelipe Jul 09 '19 at 03:26
3 Answers
In your ModelAdmin definition you can override the function has_delete_permission
. If you wish to remove the delete button for all users you can just return False
def has_delete_permission(self, request, obj=None):
return False
I would suggest however that you allow superusers to still be able to delete
def has_delete_permission(self, request, obj=None):
return request.user.is_superuser

- 31,030
- 3
- 31
- 50
-
1To clarify; this does **not** *hide* or *remove* the delete button. This makes the user not able to delete the object. This can be a problem for objects that are suppose to be implicitly deleted due to deleting a related object when having `on_delete=CASCADE`. – Ted Klein Bergman Dec 22 '20 at 15:48
-
1Nice answer. One small correction: `request.user.is_superuser()` is not callable as this is a boolean field, not a method. Edited the code. should be `request.user.is_superuser` – Shehab Ahmed Sayem Jul 06 '22 at 14:16
To remove "Delete" button, set "False" to "extra_context['show_delete']" in "changeform_view()" as shown below:
# "admin.py"
from django.contrib import admin
from .models import MyModel
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
extra_context = extra_context or {}
extra_context['show_delete'] = False # Here
# extra_context['show_save'] = False
# extra_context['show_save_and_continue'] = False
return super().changeform_view(request, object_id, form_url, extra_context)
You can also remove "Delete" button by setting "False" to "show_delete" in "context.update()" in "render_change_form()" as shown below:
# "admin.py"
from django.contrib import admin
from .models import MyModel
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None):
context.update({
'show_delete': False, # Here
# 'show_save': False,
# 'show_save_and_continue': False,
})
return super().render_change_form(request, context, add, change, form_url, obj)

- 34,399
- 18
- 41
- 57

- 22,221
- 10
- 124
- 129
You can override the function has_delete_permission
to prevent deletion
def has_delete_permission(self, request, obj=None):
return False
Overriding has_delete_permission
will prevent deletion in other model pages which have relation (with on_delete=models.CASCADE
) to your model. To allow deletion in other pages but prevent the deletion in the model's admin page, You can conditionally return False
like:
def has_delete_permission(self, request, obj=None):
if f"{model._meta.app_label}/{model._meta.model_name}" in request.path:
return False
return True

- 33
- 2
- 5