2009-06-18 6 views
6

Sur les pages d'administration de Django, je souhaite effectuer une action lorsque l'administrateur clique sur le bouton Supprimer d'un objet. En d'autres termes, je voudrais exécuter du code avant d'arriver sur le "Êtes-vous sûr?" supprimer la page de confirmation. Je réalise que je pourrais remplacer la page de modèle pour cet objet, mais j'espérais quelque chose de plus facile (à savoir, remplacer une méthode sur le modèle ou le formulaire).Est-il possible de surcharger la méthode utilisée pour appeler la page de confirmation d'administration de Django?

Des pensées?

+0

Pourquoi ne créez-vous un formulaire pour cette ? –

+6

Pourquoi devrait-il? Supprimer est une fonction de l'administrateur, pas un formulaire. –

Répondre

7

Vous pouvez remplacer la méthode ModelAdmin.delete_view(), comme:

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

vous devez retourner super (MyModelAdmin, auto .... – panchicore

+2

Est-ce que cette solution fonctionne également pour multi-supprimer dans admin django, lorsque plusieurs objets sont supprimés en une seule opération? –

2

Nous pouvons utiliser django.shortcuts.redirect pour interrompre la suppression, comme ceci:

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('..') 
Questions connexes