在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检测是文件还是目录的方法
Jul 03 Python
Python中return语句用法实例分析
Aug 04 Python
在DigitalOcean的服务器上部署flaskblog应用
Dec 19 Python
python 文件操作api(文件操作函数)
Aug 28 Python
Python爬虫:通过关键字爬取百度图片
Feb 17 Python
Python(Django)项目与Apache的管理交互的方法
May 16 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
May 18 Python
python SMTP实现发送带附件电子邮件
May 22 Python
Python实现去除图片中指定颜色的像素功能示例
Apr 13 Python
django最快程序开发流程详解
Jul 19 Python
keras .h5转移动端的.tflite文件实现方式
May 25 Python
用Python生成会跳舞的美女
Jan 18 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
关于更改Zend Studio/Eclipse代码风格主题的介绍
2013/06/23 PHP
php加密解密字符串示例
2016/10/13 PHP
Mootools 1.2 手风琴(Accordion)教程
2009/09/15 Javascript
jquery动态加载图片数据练习代码
2011/08/04 Javascript
js函数setTimeout延迟执行的简单介绍
2013/07/17 Javascript
javascript ajax 仿百度分页函数
2013/10/29 Javascript
javascript:void(0)是什么意思示例介绍
2013/11/17 Javascript
JS关键字球状旋转效果的实例代码
2013/11/29 Javascript
JS去掉第一个字符和最后一个字符的实现代码
2014/02/20 Javascript
将字符串中由空格隔开的每个单词首字母大写
2014/04/06 Javascript
jQuery中:nth-child选择器用法实例
2014/12/31 Javascript
zepto与jquery的区别及zepto的不同使用8条小结
2016/07/28 Javascript
微信小程序 网络请求(GET请求)详解
2016/11/16 Javascript
JavaScript trim 实现去除字符串首尾指定字符的简单方法
2016/12/27 Javascript
ES6使用export和import实现模块化的方法
2018/09/10 Javascript
vue双向绑定及观察者模式详解
2019/03/19 Javascript
详解vue 图片上传功能
2019/04/30 Javascript
JavaScript命令模式原理与用法实例详解
2020/03/10 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
2020/11/05 Javascript
node.js文件的复制、创建文件夹等相关操作
2021/02/05 Javascript
Python3实现并发检验代理池地址的方法
2016/09/18 Python
Python学习小技巧之列表项的拼接
2017/05/20 Python
numpy中实现ndarray数组返回符合特定条件的索引方法
2018/04/17 Python
浅谈pyqt5中信号与槽的认识
2019/02/17 Python
Python CSS选择器爬取京东网商品信息过程解析
2020/06/01 Python
Python读写csv文件流程及异常解决
2020/10/20 Python
html5 Canvas画图教程(11)—使用lineTo/arc/bezierCurveTo画椭圆形
2013/01/09 HTML / CSS
html5中 media(播放器)的api使用指南
2014/12/26 HTML / CSS
德国价格合理的品牌商品购物网站:averdo
2019/03/21 全球购物
中医专业职业生涯规划书范文
2014/01/04 职场文书
护士试用期自我鉴定
2014/02/08 职场文书
《王二小》教学反思
2014/02/27 职场文书
公务员保密承诺书
2014/03/27 职场文书
安全责任书范本
2014/04/15 职场文书
领导班子自我剖析材料
2014/08/16 职场文书
python for循环赋值问题
2021/06/03 Python