2012-03-19 14 views
13

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 

Respuesta

6

Como regla general, consulte los parámetros en la URL. Si está utilizando un slug de Tag, es probable que se trate de un DetailView y no de un ListView.

En este caso, el segundo enfoque usa menos código y es más elegante. Sin embargo, también depende de lo que va a hacer con la vista más adelante. Si va a agregar formularios para editar las publicaciones, podría tener sentido usar un ListView. Pero no hay ninguna razón técnica para preferir uno sobre el otro, es solo que podrías terminar escribiendo más código en un enfoque que en el otro.

+1

Coincidir con los parámetros de URL tiene sentido. – user1272534

+0

Gran respuesta. ¿Ahora cómo lo paginarías? Usando la vista de lista, es trivial. Haciéndolo como una vista de detalle, me pierdo :( –

+2

@DanGayle: un 'DetailView' no debe ser paginado, está destinado a ser usado con un solo objeto. –

1

Interesante pregunta. Lamentablemente, la respuesta no es tan interesante: lo que sea más lógico para ti y tu aplicación. Los argumentos pueden hacerse por igual para cualquiera de los enfoques, por lo que en realidad es solo una decisión.

Cuestiones relacionadas