2009-06-18 7 views
6

En las páginas de administración de Django, me gustaría realizar una acción cuando el administrador hace clic en el botón Eliminar de un objeto. En otras palabras, me gustaría ejecutar algún código antes de llegar al "¿Estás seguro?" borrar la página de confirmación.¿Es posible anular el método utilizado para llamar a la página de confirmación de eliminación de administrador de Django?

Me doy cuenta de que podría anular la página de la plantilla para este objeto, pero esperaba algo más sencillo (es decir, anular un método en el modelo o el formulario).

¿Alguna idea?

+0

¿Por qué no crear una forma para este ? –

+6

¿Por qué debería él? Eliminar es una función del administrador, no una forma. –

Respuesta

7

Puede anular ModelAdmin.delete_view() método, como:

class MyModelAdmin(ModelAdmin): 
    def delete_view(self, request, object_id, extra_context=None): 
     # if request.POST is set, the user already confirmed deletion 
     if not request.POST: 
      perform_my_action() 
     super(MyModelAdmin, self).delete_view(request, object_id, extra_context) 
+4

tiene que devolver super (MyModelAdmin, self .... – panchicore

+2

¿Funciona esta solución también para la eliminación múltiple en django admin, cuando se eliminan varios objetos en una sola operación? –

2

Podemos utilizar django.shortcuts.redirect interrumpir su eliminación, así:

def check_del(self, object_id): 
    produkt = Produkt.objects.get(id = object_id) 
    if produkt.typsklepu_set.all(): 
     return False 
    else: 
     return True 

def delete_view(self, request, object_id, extra_context=None): 
    # if request.POST is set, the user already confirmed deletion 
    if not request.POST and self.check_del(object_id): 
     return super(ProduktAdmin, self).delete_view(request, object_id, extra_context) 
    elif request.POST: 
     return super(ProduktAdmin, self).delete_view(request, object_id, extra_context) 
    else: 
     msg = u'Can not delete this object.' 
     messages.error(request, msg) 
     return redirect('..') 
Cuestiones relacionadas