Estoy utilizando vistas genéricas basadas en clases de Django en una aplicación de blog. Una de mis vistas muestra una lista de publicaciones que tienen cierta etiqueta. Puedo escribir esta vista como ListView
de mensajes, filtrada por etiqueta. O puedo escribir esta vista como DetailView
de la etiqueta y agregar las publicaciones relevantes al contexto.Vistas genéricas de Django: Cuándo usar ListView frente a DetailView
¿Es de una manera más apropiada - o Pythonic - que la otra?
El enfoque ListView
parece más semántica, porque lo que yo quiero es una lista de puestos, pero también es un poco más compleja. Requiere que sobrescriba dos métodos. El enfoque DetailView
solo requiere que sobrescriba un método.
class PostTagView(ListView):
"""Display all blog posts with a given tag."""
queryset = Post.objects.published()
def get_context_data(self, **kwargs):
context = super(PostTagView, self).get_context_data(**kwargs)
context['tag'] = get_object_or_404(Tag, slug=self.kwargs['slug'])
return context
def get_queryset(self, **kwargs):
queryset = super(PostTagView, self).get_queryset()
return queryset.filter(tags__slug=self.kwargs['slug'])
class TagDetailView(DetailView):
"""Display all blog posts with a given tag."""
model = Tag
def get_context_data(self, **kwargs):
context = super(TagDetailView, self).get_context_data(**kwargs)
context['object_list'] = Post.objects.published().filter(tags__slug=self.kwargs['slug'])
return context
Coincidir con los parámetros de URL tiene sentido. – user1272534
Gran respuesta. ¿Ahora cómo lo paginarías? Usando la vista de lista, es trivial. Haciéndolo como una vista de detalle, me pierdo :( –
@DanGayle: un 'DetailView' no debe ser paginado, está destinado a ser usado con un solo objeto. –