2012-05-17 2 views
5

Diciamo che ho due modelli, libro e Pagina:reindirizzamento al genitore dopo l'eliminazione di un oggetto con DeleteObject vista generico

class Book(models.Model): 
    pass 

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

ho bisogno di cancellare una pagina ed essere reindirizzato al libro specifica che la pagina apparteneva . Per raggiungere questo obiettivo, io faccio una vista basata classe per eliminare la pagina:

class PageDeleteView(DeleteView): 
    model = Page 

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

Il problema è che, dal momento che l'oggetto viene eliminato prima get_success_url viene chiamato, questo metodo non riesce e ottengo un errore 404.

Come ho potuto farlo?

Aggiornamento:

Seguendo l'idea di @DrTyrsa, ho ottenuto che l'override del metodo di eliminazione, quindi la classe sarebbe la seguente:

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

Perché PageDeleteView ha model = Book? Non dovrebbe essere model = Page? – jpic

+0

Hai ragione, jpic. Intendevo "Pagina", quindi l'ho risolto. – jantoniomartin

+0

Qui non hai bisogno di inversione pigra qui, se chiami 'reverse' da un metodo questa chiamata è già abbastanza" pigra "da non causare alcun problema. – DrTyrsa

risposta

5

Salva di pk oggetto prima di eliminare. Ad esempio, in __init__. E name your URL patterns.

+0

Forse è possibile usare kwargs ['pk']? (o forse kwargs [self.pk_url_kwarg]) – jpic

+0

DrTyrsa, i miei url sono nominati (non nell'esempio), ma nel pattern url ho il Page pk, ma non il book pk (dovrei?). È il libro pk quello che mi serve in __init__ quindi forse dovrei includerlo nel modello url, ma non mi piace questa soluzione. – jantoniomartin

+0

@jantoniomartin Anche a me non piace, è per questo che non utilizzo le viste basate sulla classe. :-) – DrTyrsa

Problemi correlati