在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中用split()方法分割字符串的使用介绍
May 20 Python
python妹子图简单爬虫实例
Jul 07 Python
Python导出DBF文件到Excel的方法
Jul 25 Python
Python实现HTTP协议下的文件下载方法总结
Apr 20 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
Aug 06 Python
python机器学习包mlxtend的安装和配置详解
Aug 21 Python
Window10下python3.7 安装与卸载教程图解
Sep 30 Python
Python实现投影法分割图像示例(二)
Jan 17 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
Sep 28 Python
python3实现简单飞机大战
Nov 29 Python
tensorflow与numpy的版本兼容性问题的解决
Jan 08 Python
Python 数据可视化之Bokeh详解
Nov 02 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
攻克CakePHP系列一 连接MySQL数据库
2008/10/22 PHP
微信公众平台实现获取用户OpenID的方法
2015/04/15 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
2017/01/12 PHP
php微信开发之谷歌测距
2018/06/14 PHP
JQuery的Validation插件中Remote验证的中文问题
2010/07/26 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
JS页面延迟执行一些方法(整理)
2013/11/11 Javascript
IE浏览器中图片onload事件无效的解决方法
2014/04/29 Javascript
jQuery中delegate()方法用法实例
2015/01/19 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
JavaScript使用pop方法移除数组最后一个元素用法实例
2015/04/06 Javascript
微信公众平台开发教程(五)详解自定义菜单
2016/12/02 Javascript
Vue.js学习记录之在元素与template中使用v-if指令实例
2017/06/27 Javascript
Vee-Validate的使用方法详解
2017/09/22 Javascript
基于JavaScript实现五子棋游戏
2020/08/26 Javascript
Gulp实现静态网页模块化的方法详解
2018/01/09 Javascript
Vue的轮播图组件实现方法
2018/03/03 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
[01:29]2014DOTA2展望TI 剑指西雅图DK战队专访
2014/06/30 DOTA
python实现微信发送邮件关闭电脑功能
2018/02/22 Python
小白如何入门Python? 制作一个网站为例
2018/03/06 Python
Python实现的寻找前5个默尼森数算法示例
2018/03/25 Python
django使用JWT保存用户登录信息
2020/04/22 Python
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
意大利辅助药品、药物和补品在线销售:FarmaEurope
2020/04/29 全球购物
单位委托书范本
2014/04/04 职场文书
学校交通安全责任书
2014/08/25 职场文书
信用卡逾期证明示例
2014/09/13 职场文书
三严三实心得体会范文
2014/10/13 职场文书
门市房租房协议书
2014/12/04 职场文书
安全生产感想
2015/08/07 职场文书
教师学习中国梦心得体会
2016/01/05 职场文书
如何理解python接口自动化之logging日志模块
2021/06/15 Python
使用CSS连接数据库的方式
2022/02/28 HTML / CSS
《最终幻想14》6.01版本4月5日推出 追加新任务新道具
2022/04/03 其他游戏