在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 相关文章推荐
Python使用自带的ConfigParser模块读写ini配置文件
Jun 26 Python
Django中Forms的使用代码解析
Feb 10 Python
利用python实现微信头像加红色数字功能
Mar 26 Python
基于scrapy的redis安装和配置方法
Jun 13 Python
python实现俄罗斯方块游戏
Mar 25 Python
Python之NumPy(axis=0 与axis=1)区分详解
May 27 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
Feb 24 Python
Python爬虫如何应对Cloudflare邮箱加密
Jun 24 Python
Python3基于print打印带颜色字符串
Jul 06 Python
基于Python3读写INI配置文件过程解析
Jul 23 Python
python将数据插入数据库的代码分享
Aug 16 Python
python使用glob检索文件的操作
May 20 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 include的妙用,实现路径加密
2008/07/29 PHP
PHP7标量类型declare用法实例分析
2016/09/26 PHP
phpmyadmin下载、安装、配置教程
2017/05/16 PHP
PHP基于面向对象实现的留言本功能实例
2018/04/04 PHP
php 中htmlentities导致中文无法查询问题
2018/09/10 PHP
javascript延时加载之defer测试
2012/12/28 Javascript
js将json格式内容转换成对象的方法
2013/11/01 Javascript
js 判断上传文件大小及格式代码
2013/11/13 Javascript
js实现div的切换特效上一个下一个
2014/02/11 Javascript
JS小游戏之宇宙战机源码详解
2014/09/25 Javascript
Angularjs编写KindEditor,UEidtor,jQuery指令
2015/01/28 Javascript
js实现漫天星星效果
2017/01/19 Javascript
angular中实现li或者某个元素点击变色的两种方法
2017/07/27 Javascript
Node.js实现mysql连接池使用事务自动回收连接的方法示例
2018/02/03 Javascript
JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
2018/02/06 Javascript
jQuery实现的页面详情展开收起功能示例
2018/06/11 jQuery
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
python获取文件版本信息、公司名和产品名的方法
2014/10/05 Python
python3安装pip3(install pip3 for python 3.x)
2018/04/03 Python
python读取各种文件数据方法解析
2018/12/29 Python
python最小生成树kruskal与prim算法详解
2019/01/17 Python
Python判断对象是否为文件对象(file object)的三种方法示例
2019/04/26 Python
python实现五子棋游戏
2019/06/18 Python
Python 下载及安装详细步骤
2019/11/04 Python
python中操作文件的模块的方法总结
2021/02/04 Python
英国123鲜花网站:123 Flowers
2019/07/07 全球购物
领先的荷兰线上超市:荷兰之家Holland at Home(支持中文)
2021/01/21 全球购物
党委书记岗位职责
2013/11/24 职场文书
医大实习自我鉴定
2013/12/07 职场文书
幼儿园消防安全制度
2014/01/26 职场文书
出纳试用期自我鉴定范文
2014/09/16 职场文书
党员教师群众路线个人整改措施
2014/10/28 职场文书
介绍信格式样本
2015/05/05 职场文书
《我的长生果》教学反思
2016/02/20 职场文书
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python
html实现弹窗的实例
2021/06/09 HTML / CSS