2016-04-14 5 views
1

Ab Django 1.7 ist es möglich, die Methode response_delete des Admin-Modells zu überschreiben, um nach dem Löschen eine Umleitung auf eine benutzerdefinierte URL zu erzwingen.Django Admin-Redirect zum übergeordneten Objekt nach dem Löschen des Objekts

class MyAdmin(admin.ModelAdmin): 

    def response_delete(self, request, obj_display, obj_id): 
     return HttpResponseRedirect("my_url") 

Ich brauche dies noch einen Schritt weiter zu nehmen und auf die Eltern des gelöschten Objekts umleiten, die wie es scheint ein ziemlich häufiger Anwendungsfall sein sollte.

Aufgrund des Löschens des Objekts ist jedoch obj nicht verfügbar, um die übergeordnete ID abzurufen.

Die hacky Lösung, die ich fand, war die übergeordnete ID in der Unicode-Darstellung des untergeordneten Objekts (obj_display) zu übergeben, analysieren dann die Zeichenkette, die es zu finden:

obj_display = '1 (Product 123)' 

integers = re.findall(r'\d+', obj_display) 
product_id = int(integers[1]) 

product_id = 123 

Doch dies scheint wie eine unelegant Lösung . Wenn beispielsweise die Unicode-Methode des Objekts geändert wurde, könnte die Weiterleitung abbrechen. Gibt es einen besseren Weg?

bearbeiten

von ‚Eltern‘ und ‚Kind‘ meine ich das gelöscht (‚Kind‘) Objekt einen Fremdschlüssel zu einem anderen Objekt hatte (seine ‚Eltern‘)

+0

was meinst du mit „das übergeordnete des gelöschten Objekts“? – trinchet

+0

Ich meine das gelöschte Objekt hat einen Fremdschlüssel zu einem anderen Objekt, das ist seine "Eltern". –

Antwort

0

Sie können dies überschreiben Methode delete_view (dort können Sie die Eltern des Objekts, bevor Sie es löschen) und statt return self.response_delete(request, obj_display, obj_id) tun, tun Sie einfach die Umleitung auf die Eltern-Admin-Seite.

0

Wenn Sie die Möglichkeit nutzen Rest delete_view behalten wollen, empfehle ich sowohl delete_view und response_delete wie diese zu überschreiben:

class MyModelAdmin(admin.ModelAdmin): 
    deleted_fk = None 

    def delete_view(self, request, object_id, extra_context=None): 
     self.deleted_fk = MyModel.objects.get(id=object_id).fk 
     return super(MyModelAdmin, self).delete_view(request, object_id, extra_context) 

    def response_delete(self, request, obj_display, obj_id): 
     return redirect('url to deleted_fk') 
Verwandte Themen