2012-03-23 19 views
6

Estaba leyendo algunos tutoriales y libros sobre generic views.¿Qué usar en Django: ListView o list_detail?

En part 4 of the official tutorial, que escribió un ejemplo como este

from django.conf.urls import patterns, include, url 
from django.views.generic import DetailView, ListView 
from polls.models import Poll 

urlpatterns = patterns('', 
    url(r'^$', 
     ListView.as_view(
      queryset=Poll.objects.order_by('-pub_date')[:5], 
      context_object_name='latest_poll_list', 
      template_name='polls/index.html')), 
    url(r'^(?P<pk>\d+)/$', 
     DetailView.as_view(
      model=Poll, 
      template_name='polls/detail.html')), 
    url(r'^(?P<pk>\d+)/results/$', 
     DetailView.as_view(
      model=Poll, 
      template_name='polls/results.html'), 
     name='poll_results'), 
    url(r'^(?P<poll_id>\d+)/vote/$', 'polls.views.vote'), 
) 

También he estado leyendo The Definitive Guide to Django: Web Development Done Right, Second Edition y cuando hablaban de las vistas genéricas, que escribieron su ejemplo como este

from django.conf.urls.defaults import * 
from django.views.generic import list_detail 
from mysite.books.models import Publisher 

publisher_info = { 
    'queryset': Publisher.objects.all(), 
    'template_name': 'publisher_list_page.html', 
} 

urlpatterns = patterns('', 
    (r'^publishers/$', list_detail.object_list, publisher_info) 
) 

¿Debo estar usando ListView o list_detail? Ambos vienen de django.views.generic. Si ambos pueden usarse, ¿cuál es la diferencia (comparación de ventaja y desventaja)?

En caso de que ayude, explicaré mi objetivo: en mi proyecto, quiero enumerar las órdenes de trabajo, y luego quiero una vista detallada de cada orden de trabajo que también contendrá una lista de comentarios para esa orden (similar a los comentarios por publicación de blog).

Respuesta

10

ListView (basado en clase) está destinado a reemplazar object_list (basado en función) porque hay una flexibilidad limitada para extender el comportamiento de una función.

Como Django (1.4) documentation notes, las vistas genéricas basadas en funciones están en desuso en favor de las versiones basadas en clases. Así que use ListView, ya que Django eliminó object_list.

De cualquier manera, prefiero poner todas las personalizaciones en views.py para evitar abarrotar urls.py, que tiende a ser un vertedero de cosas.

+1

Realmente no entiendo la documentación de vista genérica basada en clase. Por ejemplo, para ['ListView'] (https://docs.djangoproject.com/en/dev/ref/class-based-views/#list-views), ¿por qué la entrada es tan corta? ¿Dónde puedo encontrar la lista de todos los métodos y variables? – hobbes3

+4

Lamentablemente, es parte de una mala documentación por parte de Django (en parte debido a la herencia múltiple). Pero puede ver lo que subclase: p. Ej. - https://docs.djangoproject.com/en/dev/ref/class-based-views/#django.views.generic.list.MultipleObjectMixin – Jeff

12

estoy encontrando con clase útil como una manera fácil de ver un resumen de cada CBV: http://ccbv.co.uk/projects/Django/1.6/django.views.generic.list/ListView/

Se siente como una parte que falta de la documentación de Django ahora.

+3

Esta no es la respuesta aceptada, pero este recurso es increíble. – edhedges

+0

Lamentablemente, el enlace aparece roto :( – moooeeeep

+0

Acabo de comprobarlo y la URL todavía funciona para mí, la uso la mayoría de los días. Edité el comentario para incluir Dj 1.6. – trojjer

Cuestiones relacionadas