Django框架中的对象列表视图使用示例
direct_to_template毫无疑问是非常有用的,但Django通用视图最有用的地方是呈现数据库中的数据。因为这个应用实在太普遍了,Django带有很多内建的通用视图来帮助你很容易地生成对象的列表和明细视图。
让我们先看看其中的一个通用视图:对象列表视图。我们使用第五章中的Publisher来举例:
classPublisher(models.Model): name=models.CharField(max_length=30) address=models.CharField(max_length=50) city=models.CharField(max_length=60) state_province=models.CharField(max_length=30) country=models.CharField(max_length=50) website=models.URLField() def__unicode__(self): returnself.name classMeta: ordering=['name']
要为所有的出版商创建一个列表页面,我们使用下面的URL配置:
fromdjango.conf.urls.defaultsimport* fromdjango.views.genericimportlist_detail frommysite.books.modelsimportPublisher publisher_info={ 'queryset':Publisher.objects.all(), } urlpatterns=patterns('', (r'^publishers/$',list_detail.object_list,publisher_info) )
这就是所要编写的所有Python代码。当然,我们还需要编写一个模板。我们可以通过在额外参数字典中包含一个template_name键来显式地告诉object_list视图使用哪个模板:
fromdjango.conf.urls.defaultsimport* fromdjango.views.genericimportlist_detail frommysite.books.modelsimportPublisher publisher_info={ 'queryset':Publisher.objects.all(), **'template_name':'publisher_list_page.html',** } urlpatterns=patterns('', (r'^publishers/$',list_detail.object_list,publisher_info) )
在缺少template_name的情况下,object_list通用视图将自动使用一个对象名称。在这个例子中,这个推导出的模板名称将是"books/publisher_list.html",其中books部分是定义这个模型的app的名称,publisher部分是这个模型名称的小写。
这个模板将按照context中包含的变量object_list来渲染,这个变量包含所有的书籍对象。一个非常简单的模板看起来象下面这样:
{%extends"base.html"%} {%blockcontent%} <h2>Publishers</h2> <ul> {%forpublisherinobject_list%} <li>{{publisher.name}}</li> {%endfor%} </ul> {%endblock%}
(注意,这里我们假定存在一个base.html模板。)
这就是所有要做的事。要使用通用视图酷酷的特性只需要修改参数字典并传递给通用视图函数。附录D是通用视图的完全参考资料;本章接下来的章节将讲到自定义和扩展通用视图的一些方法。