我正在阅读有关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
。如果它们都可以使用,那么有什么区别(优势和劣势比较)?
如果它有帮助,我将解释我的目标:在我的项目中,我想列出工单,然后我想要每个工单的详细视图,其中还包含该订单的评论列表(类似每篇博文的评论)。
答案 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,这往往是事物的倾销。