7

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

enter image description here

Super Kai - Kazuya Ito
  • 22,221
  • 10
  • 124
  • 129
vinod sagar
  • 115
  • 2
  • 7

3 Answers3

15

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
Iain Shelvington
  • 31,030
  • 3
  • 31
  • 50
  • 1
    To 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
  • 1
    Nice 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
4

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)
Henry Ecker
  • 34,399
  • 18
  • 41
  • 57
Super Kai - Kazuya Ito
  • 22,221
  • 10
  • 124
  • 129
3

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
iamwaseem99
  • 33
  • 2
  • 5