在Django的通用视图中处理Context的方法


Posted in Python onJuly 21, 2015

制作友好的模板Context

你也许已经注意到范例中的出版商列表模板在变量 object_list 里保存所有的书籍。这个方法工作的很好,只是对编写模板的人不太友好。 他们必须知道这里正在处理的是书籍。 更好的变量名应该是publisher_list,这样变量所代表的内容就显而易见了。

我们可以很容易地像下面这样修改 template_object_name 参数的名称:

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',
  'template_object_name': 'publisher',
}

urlpatterns = patterns('',
  (r'^publishers/$', list_detail.object_list, publisher_info)
)

在模板中,通用视图会通过在template_object_name后追加一个_list的方式来创建一个表示列表项目的变量名。

使用有用的 template_object_name 总是个好想法。 你的设计模板的合作伙伴会感谢你的。
添加额外的Context

你常常需要呈现比通用视图提供的更多的额外信息。 例如,考虑一下在每个出版商的详细页面显示所有其他出版商列表。 object_detail 通用视图为context提供了出版商信息,但是看起来没有办法在模板中 获取 所有 出版商列表。

这是解决方法: 所有的通用视图都有一个额外的可选参数 extra_context 。这个参数是一个字典数据类型,包含要添加到模板的context中的额外的对象。 所以要给视图提供所有出版商的列表,我们就用这样的info字典:

publisher_info = {
  'queryset': Publisher.objects.all(),
  'template_object_name': 'publisher',
  **'extra_context': {'book_list': Book.objects.all()}**
}

这样就把一个 {{ book_list }} 变量放到模板的context中。 这个方法可以用来传递任意数据 到通用视图模板中去,非常方便。 这是非常方便的

不过,这里有一个很隐蔽的BUG,不知道你发现了没有?

我们现在来看一下, extra_context 里包含数据库查询的问题。 因为在这个例子中,我们把 Publisher.objects.all() 放在URLconf中,它只会执行一次(当URLconf第一次加载的时候)。 当你添加或删除出版商,你会发现在重启Web服务器之前,通用视图不会反映出这些修改(有关QuerySet何时被缓存和赋值的更多信息请参考附录C中“缓存与查询集”一节)。

备注

这个问题不适用于通用视图的 queryset 参数。 因为Django知道有些特别的 QuerySet 永远不能 被缓存,通用视图在渲染前都做了缓存清除工作。

解决这个问题的办法是在 extra_context 中用一个回调(callback)来代替使用一个变量。 任何传递给extra_context的可调用对象(例如一个函数)都会在每次视图渲染前执行(而不是只执行一次)。 你可以象这样定义一个函数:

**def get_books():**
  **return Book.objects.all()**

publisher_info = {
  'queryset': Publisher.objects.all(),
  'template_object_name': 'publisher',
  'extra_context': **{'book_list': get_books}**
}

或者你可以使用另一个不是那么清晰但是很简短的方法,事实上 Publisher.objects.all 本身就是可以调用的:

publisher_info = {
  'queryset': Publisher.objects.all(),
  'template_object_name': 'publisher',
  'extra_context': **{'book_list': Book.objects.all}**
}

注意 Book.objects.all 后面没有括号;这表示这是一个函数的引用,并没有真正调用它(通用视图将会在渲染时调用它)。

Python 相关文章推荐
Django中使用locals()函数的技巧
Jul 16 Python
python自带的http模块详解
Nov 06 Python
python爬虫_自动获取seebug的poc实例
Aug 05 Python
python爬虫正则表达式之处理换行符
Jun 08 Python
Python利用递归实现文件的复制方法
Oct 27 Python
python enumerate内置函数用法总结
Jan 07 Python
pytorch1.0中torch.nn.Conv2d用法详解
Jan 10 Python
基于python求两个列表的并集.交集.差集
Feb 10 Python
python 爬取免费简历模板网站的示例
Sep 27 Python
用python写PDF转换器的实现
Oct 29 Python
pytorch加载语音类自定义数据集的方法教程
Nov 10 Python
基于OpenCV的网络实时视频流传输的实现
Nov 15 Python
Django框架中的对象列表视图使用示例
Jul 21 #Python
在Python的Django框架中使用通用视图的方法
Jul 21 #Python
在Django的模型中执行原始SQL查询的方法
Jul 21 #Python
在Django的模型中添加自定义方法的示例
Jul 21 #Python
详解Python的Django框架中Manager方法的使用
Jul 21 #Python
通过数据库对Django进行删除字段和删除模型的操作
Jul 21 #Python
通过数据库向Django模型添加字段的示例
Jul 21 #Python
You might like
一个php作的文本留言本的例子(六)
2006/10/09 PHP
php 文章采集正则代码
2009/12/28 PHP
php导出csv格式数据并将数字转换成文本的思路以及代码分享
2014/06/05 PHP
thinkphp中html:list标签传递多个参数实例
2014/10/30 PHP
PHP合并数组+号和array_merge的区别
2015/06/25 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
JS获取并操作iframe中元素的方法
2013/03/21 Javascript
一个简单的JS鼠标悬停特效具体方法
2013/06/17 Javascript
js触发select onchange事件的小技巧
2014/08/05 Javascript
jQuery中:selected选择器用法实例
2015/01/04 Javascript
JavaScript获取网页中第一个图片id的方法
2015/04/03 Javascript
简介AngularJS的视图功能应用
2015/06/17 Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
2015/10/28 Javascript
点评js异步加载的4种方式
2015/12/22 Javascript
AngularJS使用angular-formly进行表单验证
2015/12/27 Javascript
jQuery获取this当前对象子元素对象的方法
2016/11/29 Javascript
如何在Angular2中使用jQuery及其插件的方法
2017/02/09 Javascript
Vue Router去掉url中默认的锚点#
2018/08/01 Javascript
VUE中v-on:click事件中获取当前dom元素的代码
2018/08/22 Javascript
小程序实现列表删除功能
2018/10/30 Javascript
浅谈Vue中render中的h箭头函数
2019/11/07 Javascript
Javascript confirm多种使用方法解析
2020/09/25 Javascript
Python解决pip install时出现的Could not fetch URL问题
2019/08/01 Python
python绘制彩虹图
2019/12/16 Python
Bally巴利中国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/10/09 全球购物
超级英雄、电影和电视、乐队和音乐T恤:Loud Clothing
2019/09/01 全球购物
三年级科学教学反思
2014/01/29 职场文书
班级旅游计划书
2014/05/03 职场文书
2014司机年终工作总结
2014/12/05 职场文书
医药公司采购员岗位职责
2015/04/03 职场文书
2015年教学管理工作总结
2015/05/20 职场文书
经济纠纷起诉状
2015/05/20 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书
导游词之河北邯郸
2019/09/12 职场文书
如何在pycharm中快捷安装pip命令(如pygame)
2021/05/31 Python