2012-05-17 8 views
5

Lassen Sie sich sagen, ich habe zwei Modelle, Buch und Seite:Umleiten zu Eltern, nachdem ein Objekt mit DeleteObject allgemeiner Ansicht löschte

class Book(models.Model): 
    pass 

class Page(models.Model): 
    book = models.ForeignKey(Book) 

Ich brauche eine Seite zu löschen und auf das spezifische Buch umgeleitet werden, dass die Seite der dominierende Mannschaft . Um dies zu erreichen, mache ich eine Klasse basierend Ansicht, die die Seite zu löschen:

class PageDeleteView(DeleteView): 
    model = Page 

    def get_success_url(self, **kwargs): 
     return reverse_lazy('book_detail', self.book.pk) 

Das Problem ist, dass, da das Objekt gelöscht wird, bevor get_success_url aufgerufen wird, versagt diese Methode, und ich erhalte einen 404-Fehler.

Wie könnte ich es tun?

Update:

die Idee @DrTyrsa Folgen, habe ich es die Lösch Methode überschreibt erreicht, so würde die Klasse wie folgt:

reverse_lazy = lambda name=None, *args : lazy(reverse, str)(name, args=args) 

class PageDeleteView(DeleteView): 
    model = Page 

    def get_success_url(self, **kwargs): 
     return reverse_lazy('book_detail', self.book.pk) 

    def delete(self, request, *args, **kwargs): 
     self.book_pk = self.get_object().book.pk 
     return super(PageDeleteView, self).delete(request, *args, **kwargs) 
+0

Warum hat PageDeleteView model = Book? Sollte es nicht Model = Page sein? – jpic

+0

Sie haben Recht, jpic. Ich meinte 'Seite', also habe ich es behoben. – jantoniomartin

+0

Sie brauchen hier nicht faul umzukehren, wenn Sie 'reverse' von einer Methode aufrufen, ist dieser Aufruf bereits" faul "genug, um kein Problem zu verursachen. – DrTyrsa

Antwort

5

speichert Objekt pk vor dem Löschen. Zum Beispiel in __init__. Und name your URL patterns.

+0

Vielleicht ist es möglich, kwargs ['pk'] zu verwenden? (oder vielleicht kwargs [self.pk_url_kwarg]) – jpic

+0

DrTyrsa, meine URLs sind benannt (nicht im Beispiel), aber im URL-Muster habe ich die Page pk, aber nicht das Buch pk (soll ich?). Es ist das Buch pk, was ich in __init__ brauche, also sollte ich es vielleicht in das URL-Muster aufnehmen, aber ich mag diese Lösung nicht. – jantoniomartin

+0

@jantoniomartin Ich mag es auch nicht, deshalb verwende ich keine klassenbasierten Ansichten. :-) – DrTyrsa