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)
Perché PageDeleteView ha model = Book? Non dovrebbe essere model = Page? – jpic
Hai ragione, jpic. Intendevo "Pagina", quindi l'ho risolto. – jantoniomartin
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