Estoy usando la vista genérica DetailView basada en clase de Django para buscar un objeto para visualizar. Bajo ciertas circunstancias, en lugar de mostrar el objeto, deseo retroceder y emitir un rediect HTTP en su lugar. No puedo ver cómo hago esto. Es para cuando un usuario golpea un objeto en mi aplicación, pero sin utilizar la URL canónica. Así, por ejemplo, en las direcciones URL StackOverflow tomar la forma:Redirigir desde Vista genérica DetailView en Django
http://stackoverflow.com/<content_type>/<pk>/<seo_friendly_slug>
por ejemplo:
http://stackoverflow.com/questions/5661806/django-debug-toolbar-with-django-cms-and-django-1-3
En realidad se puede escribir nada como la parte seo_friendly_slug y se le redirigirá a la URL canónica correcta para el objeto mirado a través del PK.
Deseo hacer lo mismo en mi DetailView. Recupere el objeto, verifique que sea la URL canónica y, si no, redirija a la URL get_absolute_url del elemento.
No puedo devolver un HttpResponseRedirect en get_object, ya que está esperando el objeto buscado. Parece que no puedo devolverlo desde get_context_data, ya que solo estoy esperando datos contextuales.
Tal vez solo necesito escribir una vista manual, pero me preguntaba si alguien sabía si era posible.
Gracias!
Ludo.
Puede llamar al método de obtención de los padres en el caso else aquí. Sería mucho más limpio. Vale totalmente la pena ya que las vistas genéricas basadas en clases están disponibles para ser ampliadas para la funcionalidad personalizada. – vimukthi
Lo bueno de su enfoque es que no tenemos que preocuparnos si la implementación de BaseDetailView.get cambia, pero la desventaja es que tendríamos que hacer la recuperación de objetos dos veces para cada solicitud, que para mí no es vale la pena el potencial de rendimiento/escalabilidad. – Rolo
Para evitar el doble golpe a 'get_object' puedes anularlo en tu propia clase o mixin y prefacio con un cheque' if hasattr (self, 'object', None) '; si la verificación tiene éxito, devuelve 'self.object'; de lo contrario, llama al' get_object' de parent. Exactamente como se implementó @Rakrakraut (https://stackoverflow.com/a/12858110). – interDist