2009-06-18 8 views
6

Nelle pagine di amministrazione di Django, vorrei eseguire un'azione quando l'amministratore fa clic sul pulsante Elimina per un oggetto. In altre parole, mi piacerebbe eseguire del codice prima di arrivare su "Sei sicuro?" cancella la pagina di conferma.È possibile sovrascrivere il metodo utilizzato per chiamare la pagina di conferma dell'eliminazione dell'amministratore di Django?

Mi rendo conto che potrei sovrascrivere la pagina di modello per questo oggetto, ma speravo in qualcosa di più semplice (cioè, sovrascrivere un metodo sul modello o sul modulo).

Qualche idea?

+0

Perché non si sta creando un modulo per questo ? –

+6

Perché dovrebbe? L'eliminazione è una funzione dell'amministratore, non un modulo. –

risposta

7

È possibile ignorare ModelAdmin.delete_view() metodo, come:

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

devi restituire super (MyModelAdmin, self .... – panchicore

+2

Questa soluzione funziona anche per l'eliminazione multipla nell'amministratore di django, quando diversi oggetti vengono eliminati in un'unica operazione? –

2

Possiamo usare django.shortcuts.redirect per interrompere l'eliminazione, in questo modo:

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('..') 
Problemi correlati