在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实现360皮肤按钮控件示例
Feb 21 Python
深入剖析Python的爬虫框架Scrapy的结构与运作流程
Jan 20 Python
Python基于贪心算法解决背包问题示例
Nov 27 Python
pandas带有重复索引操作方法
Jun 08 Python
详解Python下Flask-ApScheduler快速指南
Nov 04 Python
python3实现点餐系统
Jan 24 Python
Python中遍历列表的方法总结
Jun 27 Python
python英语单词测试小程序代码实例
Sep 09 Python
用python实现一个简单的验证码
Dec 09 Python
浅谈Python数学建模之数据导入
Jun 23 Python
OpenCV图像变换之傅里叶变换的一些应用
Jul 26 Python
python实现对doc、txt、xls等文档的读写操作
Apr 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
关于拼配咖啡,你要知道
2021/03/03 咖啡文化
映彩衣的js随笔(js图片切换效果)
2011/07/31 Javascript
Flex通过JS获取客户端IP和计算机名的实例代码
2013/11/21 Javascript
js检测网络是否具体连接功能的代码
2014/05/23 Javascript
jQuery的图片滑块焦点图插件整理推荐
2014/12/07 Javascript
封装了jQuery的Ajax请求全局配置
2015/02/05 Javascript
JavaScript中的Repaint和Reflow用法详解
2015/07/27 Javascript
JavaScript学习笔记之DOM基础 2.4
2015/08/14 Javascript
jQuery实现批量判断表单中文本框非空的方法(2种方法)
2015/12/09 Javascript
jQuery each函数源码分析
2016/05/25 Javascript
js实现String.Fomat的实例代码
2016/09/02 Javascript
JavaScript制作简单分页插件
2016/09/11 Javascript
浅谈javascript alert和confirm的美化
2016/12/15 Javascript
EasyUI学习之Combobox级联下拉列表(2)
2016/12/29 Javascript
超出JavaScript安全整数限制的数字计算BigInt详解
2018/06/24 Javascript
vue使用localStorage保存登录信息 适用于移动端、PC端
2019/05/27 Javascript
使用jQuery实现购物车
2020/10/29 jQuery
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
2021/03/01 Vue.js
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
2014/11/06 Python
Python从MP3文件获取id3的方法
2015/06/15 Python
Python 查找list中的某个元素的所有的下标方法
2018/06/27 Python
解决django中ModelForm多表单组合的问题
2019/07/18 Python
详解Python实现进度条的4种方式
2020/01/15 Python
python PIL模块的基本使用
2020/09/29 Python
html5简单示例_动力节点Java学院整理
2017/07/07 HTML / CSS
美国最大的宠物用品零售商:PetSmart
2016/11/14 全球购物
加拿大在线旅游公司:Flighthub
2019/03/11 全球购物
linux面试题参考答案(5)
2016/11/05 面试题
捐书活动总结
2014/05/04 职场文书
安全标语大全
2014/06/10 职场文书
会计专业毕业生自荐书
2014/06/25 职场文书
综合素质自我评价评语
2015/03/06 职场文书
钓鱼岛事件感想
2015/08/11 职场文书
廉洁自律承诺书2016
2016/03/25 职场文书
Python数据可视化之用Matplotlib绘制常用图形
2021/06/03 Python
MySQL常用慢查询分析工具详解
2022/08/14 MySQL