对象的通用视图

direct_to_template 毫无疑问是非常有用的,但Django通用视图最有用的地方是呈现数据库中的数据。 因为这个应用实在太普遍了,Django带有很多内建的通用视图来帮助你很容易 地生成对象的列表和明细视图。

让我们先看看其中的一个通用视图: 对象列表视图。 我们使用第五章中的 Publisher 来举例:

  1. class Publisher(models.Model):
  2. name = models.CharField(max_length=30)
  3. address = models.CharField(max_length=50)
  4. city = models.CharField(max_length=60)
  5. state_province = models.CharField(max_length=30)
  6. country = models.CharField(max_length=50)
  7. website = models.URLField()
  8. def __unicode__(self):
  9. return self.name
  10. class Meta:
  11. ordering = ['name']

要为所有的出版商创建一个列表页面,我们使用下面的URL配置:

  1. from django.conf.urls.defaults import *
  2. from django.views.generic import list_detail
  3. from mysite.books.models import Publisher
  4. publisher_info = {
  5. 'queryset': Publisher.objects.all(),
  6. }
  7. urlpatterns = patterns('',
  8. (r'^publishers/$', list_detail.object_list, publisher_info)
  9. )

这就是所要编写的所有Python代码。 当然,我们还需要编写一个模板。 我们可以通过在额外参数字典中包含一个template_name键来显式地告诉object_list视图使用哪个模板:

  1. from django.conf.urls.defaults import *
  2. from django.views.generic import list_detail
  3. from mysite.books.models import Publisher
  4. publisher_info = {
  5. 'queryset': Publisher.objects.all(),
  6. **'template_name': 'publisher_list_page.html',**
  7. }
  8. urlpatterns = patterns('',
  9. (r'^publishers/$', list_detail.object_list, publisher_info)
  10. )

在缺少template_name的情况下,object_list通用视图将自动使用一个对象名称。 在这个例子中,这个推导出的模板名称将是 "books/publisher_list.html" ,其中books部分是定义这个模型的app的名称, publisher部分是这个模型名称的小写。

这个模板将按照 context 中包含的变量 object_list 来渲染,这个变量包含所有的书籍对象。 一个非常简单的模板看起来象下面这样:

  1. {% extends "base.html" %}
  2. {% block content %}
  3. <h2>Publishers</h2>
  4. <ul>
  5. {% for publisher in object_list %}
  6. <li>{{ publisher.name }}</li>
  7. {% endfor %}
  8. </ul>
  9. {% endblock %}

(注意,这里我们假定存在一个base.html模板,它和我们第四章中的一样。)

这就是所有要做的事。 要使用通用视图酷酷的特性只需要修改参数字典并传递给通用视图函数。 附录D是通用视图的完全参考资料;本章接下来的章节将讲到自定义和扩展通用视图的一些方法。