时间:2021-07-01 10:21:17 帮助过:26人阅读
让我们先看看其中的一个通用视图: 对象列表视图。 我们使用第五章中的 Publisher 来举例:
- class Publisher(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):
- return self.name
- class Meta:
- ordering = ['name']
要为所有的出版商创建一个列表页面,我们使用下面的URL配置:
- 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(),
- }
- urlpatterns = patterns('',
- (r'^publishers/$', list_detail.object_list, publisher_info)
- )
这就是所要编写的所有Python代码。 当然,我们还需要编写一个模板。 我们可以通过在额外参数字典中包含一个template_name键来显式地告诉object_list视图使用哪个模板:
- 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)
- )
在缺少template_name的情况下,object_list通用视图将自动使用一个对象名称。 在这个例子中,这个推导出的模板名称将是 "books/publisher_list.html" ,其中books部分是定义这个模型的app的名称, publisher部分是这个模型名称的小写。
这个模板将按照 context 中包含的变量 object_list 来渲染,这个变量包含所有的书籍对象。 一个非常简单的模板看起来象下面这样:
- {% extends "base.html" %}
- {% block content %}
- <h2>Publishers</h2>
- <ul>
- {% for publisher in object_list %}
- <li>{{ publisher.name }}</li>
- {% endfor %}
- </ul>
- {% endblock %}
(注意,这里我们假定存在一个base.html模板。)
这就是所有要做的事。 要使用通用视图酷酷的特性只需要修改参数字典并传递给通用视图函数。 附录D是通用视图的完全参考资料;本章接下来的章节将讲到自定义和扩展通用视图的一些方法。