Deshabilitar borrado de registros Django

Una bonita foto de Samba, nuestra perrita ^^

Nuestro compañero Dani Tortosa, ha escrito este breve tutorial, sobre como deshabilitar el borrado de registros de un modelo concreto en Django Admin.

A veces queremos evitar que desde la administración se borre el contenido de algunos modelos, por ejemplo contenidos fijos de la página, como pueden ser los términos y condiciones, o categorías de los menús que nos interesa que se puedan modificar pero no borrar.

Esto lo podemos conseguir mediante el archivo admin.py de cada modelo, realmente hay dos formas de borrar un registro, mediante el botón de borrar que nos aparece al editar o mediante el select del pie de la lista de registros. Así que lo que tenemos que hacer es deshabilitar ambos.

El select del pie de la lista muestra acciones, por defecto solo muestra la de borrar, pero podemos añadirle más si queremos, si solo tenemos la acción de borrar al deshabilitarla desaparecerá este select. Vamos a ver cómo lo haríamos.

El select con la opción de eliminar.

Lo primero que tenemos que hacer es definir la clase para después poder utilizarla y decirle a Django cual es el modelo que queremos modificar.

class mymodelAdmin(admin.ModelAdmin):
 
 model = mymodel

A continuación introduciríamos la función para deshabilitar esta acción:

def get_actions(self, request):
 actions = super(mymodelAdmin, self).get_actions(request) # Obtenemos todas las acciones de este modelo
 del actions[‘delete_selected’] # Deshabilitamos la opción de borrar
 return actions

Y con esto ya tendríamos dehabilitada la acción del select, pero los registros todavía serían borrables desde la edición, así que vamos a ver la siguiente función, que son dos líneas:

def has_delete_permission(self, request, obj=None):
 return False

Opción eliminar, desde dentro del propio object.

Con esta función deshabilitaríamos el botón de eliminar que sale al editar el registro. Y para terminar y que todo funcione como toca tendríamos que registrar este proceso, para ello haremos lo siguiente:

admin.site.register(mymodel,mymodelAdmin)

Al registrar la función en el admin.py, desaparece de dentro de la edición del objeto.

Espero que os haya sido útil este artículo, un saludo.

Dani Tortosa. 
@leasti