在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程序中操作文件之isatty()方法的使用教程
May 24 Python
python rsa 加密解密
Mar 20 Python
python链接oracle数据库以及数据库的增删改查实例
Jan 30 Python
解决Python requests库编码 socks5代理的问题
May 07 Python
pycharm中使用anaconda部署python环境的方法步骤
Dec 19 Python
Python3中的最大整数和最大浮点数实例
Jul 09 Python
django 做 migrate 时 表已存在的处理方法
Aug 31 Python
python GUI库图形界面开发之PyQt5下拉列表框控件QComboBox详细使用方法与实例
Feb 27 Python
基于matplotlib xticks用法详解
Apr 16 Python
Python日志:自定义输出字段 json格式输出方式
Apr 27 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
Jun 04 Python
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
Jun 07 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
FCKeditor添加自定义按钮
2008/03/27 PHP
php结合表单实现一些简单功能的例子
2011/06/04 PHP
PHP封装XML和JSON格式数据接口操作示例
2019/03/06 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
2019/04/02 PHP
Javascript写了一个清除“logo1_.exe”的杀毒工具(可扫描目录)
2007/02/09 Javascript
IE和Mozilla的兼容性汇总event
2007/08/12 Javascript
判断iframe是否加载完成的完美方法
2010/01/07 Javascript
预加载css或javascript的js代码
2010/04/23 Javascript
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
GridView中获取被点击行中的DropDownList和TextBox中的值
2013/07/18 Javascript
js实现单行文本向上滚动效果实例代码
2013/11/28 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
JQuery跳出each循环的方法
2015/04/16 Javascript
究竟什么是Node.js?Node.js有什么好处?
2015/05/29 Javascript
jQuery实现TAB风格的全国省份城市滑动切换效果代码
2015/08/24 Javascript
JS模拟Dialog弹出浮动框效果代码
2015/10/16 Javascript
浅析jquery unbind()方法移除元素绑定的事件
2016/05/24 Javascript
Bootstrap 3的box-sizing样式导致UEditor控件的图片无法正常缩放的解决方案
2016/09/15 Javascript
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
2017/09/06 Javascript
angular ng-model 无法获取值的处理方法
2018/10/02 Javascript
js实现图片粘贴到网页
2019/12/06 Javascript
[02:51]DOTA2 Supermajor小组分组对阵抽签仪式
2018/06/01 DOTA
浅谈pandas中DataFrame关于显示值省略的解决方法
2018/04/08 Python
Python3 实现文件批量重命名示例代码
2019/06/03 Python
详解Django模版中加载静态文件配置方法
2019/07/21 Python
500行代码使用python写个微信小游戏飞机大战游戏
2019/10/16 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
英国的潮牌鞋履服饰商店:size?
2019/03/26 全球购物
寄语是什么意思
2014/04/10 职场文书
公共艺术专业自荐信
2014/09/01 职场文书
2014年向国旗敬礼活动总结
2014/09/27 职场文书
简易离婚协议书范本2014
2014/10/15 职场文书
高校教师个人工作总结2014
2014/12/17 职场文书
党员自评材料范文
2014/12/17 职场文书
2016幼儿园教师节新闻稿
2015/11/25 职场文书
Python使用pandas导入csv文件内容的示例代码
2022/12/24 Python