在Django中使用哪个:ListView或list_detail?

时间:2012-03-23 04:36:57

标签: django django-urls

我正在阅读有关generic views的一些教程和书籍。

part 4 of the official tutorial中,他们写了一个像这样的例子

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'),
)

我一直在阅读The Definitive Guide to Django: Web Development Done Right, Second Edition,当他们谈到通用视图时,他们就像这样写了他们的例子

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)
)

我应该使用ListView还是list_detail?他们都来自django.views.generic。如果它们都可以使用,那么有什么区别(优势和劣势比较)?

如果它有帮助,我将解释我的目标:在我的项目中,我想列出工单,然后我想要每个工单的详细视图,其中还包含该订单的评论列表(类似每篇博文的评论)。

2 个答案:

答案 0 :(得分:12)

我发现Classy非常有用,可以轻松查看每个CBV的轮廓:http://ccbv.co.uk/projects/Django/1.6/django.views.generic.list/ListView/

现在感觉就像是Django文档的缺失部分。

答案 1 :(得分:10)

ListView(基于类)旨在替换object_list(基于函数),因为扩展函数行为的灵活性有限。

作为Django (1.4) documentation notes,不推荐使用基于函数的通用视图,而使用基于类的版本。因此,使用ListView,因为Django删除了object_list

无论哪种方式,我都希望将所有自定义设置放在views.py中,以避免混淆urls.py,这往往是事物的倾销。