Digamos que tengo dos modelos, el libro y página:Redirigir a los padres después de eliminar un objeto con DeleteObject vista genérica
class Book(models.Model):
pass
class Page(models.Model):
book = models.ForeignKey(Book)
tengo que eliminar una página y ser redirigido al libro específico que la página pertenecía a . Para lograr esto, hago un punto de vista basado clase para eliminar la página:
class PageDeleteView(DeleteView):
model = Page
def get_success_url(self, **kwargs):
return reverse_lazy('book_detail', self.book.pk)
El problema es que, dado que se elimina el objeto antes get_success_url se llama, este método falla, y me da un error 404.
¿Cómo podría hacerlo?
Actualización:
Siguiendo la idea de @DrTyrsa, lo he conseguido reemplazando el método de eliminación, por lo que la clase sería de la siguiente manera:
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)
¿Por qué PageDeleteView tiene el modelo = Libro? ¿No debería ser modelo = Página? – jpic
Tienes razón, jpic. Quise decir 'Página', así que lo arreglé. – jantoniomartin
No necesita invertir la marcha lenta, si llama 'reverse' desde un método, esta llamada ya es" floja "lo suficiente como para no causar ningún problema. – DrTyrsa