在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破解验证码实例详解
Dec 08 Python
对pandas中apply函数的用法详解
Apr 10 Python
python使用folium库绘制地图点击框
Sep 21 Python
解决Django生产环境无法加载静态文件问题的解决
Apr 23 Python
Python基础知识点 初识Python.md
May 14 Python
python实现微信小程序用户登录、模板推送
Aug 28 Python
python3实现微型的web服务器
Sep 03 Python
python 实现批量替换文本中的某部分内容
Dec 13 Python
Python中and和or如何使用
May 28 Python
Python异常处理机制结构实例解析
Jul 23 Python
如何使用Pytorch搭建模型
Oct 26 Python
Python中的变量与常量
Nov 11 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一句话cmdshell新型 (非一句话木马)
2009/04/18 PHP
基于php split()函数的用法详解
2013/06/05 PHP
PHP数据库链接类(PDO+Access)实例分享
2013/12/05 PHP
php在数据库抽象层简单使用PDO的方法
2015/11/03 PHP
详解JavaScript的回调函数
2015/11/20 Javascript
果断收藏9个Javascript代码高亮脚本
2016/01/06 Javascript
使用jquery提交form表单并自定义action的实现代码
2016/05/25 Javascript
Angularjs中三种数据的绑定策略(“@”,“=”,“&”)
2016/12/23 Javascript
Angular组件化管理实现方法分析
2017/03/17 Javascript
js实现简易聊天对话框
2017/08/17 Javascript
使用vue与jquery实时监听用户输入状态的操作代码
2017/09/19 jQuery
Vue常用指令详解分析
2018/08/19 Javascript
node.js中ws模块创建服务端和客户端,网页WebSocket客户端
2019/03/06 Javascript
vue基础之模板和过滤器用法实例分析
2019/03/12 Javascript
angular *Ngif else用法详解
2020/12/15 Javascript
[40:48]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第二局
2016/02/28 DOTA
[01:01:36]Optic vs paiN 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
使用Python编写Linux系统守护进程实例
2015/02/03 Python
TensorFlow在MAC环境下的安装及环境搭建
2017/11/14 Python
Django中的ajax请求
2018/10/19 Python
python简单实现AES加密和解密
2019/03/28 Python
Python对ElasticSearch获取数据及操作
2019/04/24 Python
python网络爬虫 Scrapy中selenium用法详解
2019/09/28 Python
python中的itertools的使用详解
2020/01/13 Python
Python连接SQLite数据库并进行增册改查操作方法详解
2020/02/18 Python
QML用PathView实现轮播图
2020/06/03 Python
pycharm中如何自定义设置通过“ctrl+滚轮”进行放大和缩小实现方法
2020/09/16 Python
新秀丽官方旗舰店:Samsonite拉杆箱、双肩包、皮具
2018/03/05 全球购物
构造方法和其他方法的区别
2016/04/26 面试题
八项规定整改方案
2014/02/21 职场文书
城管大队整治方案
2014/05/06 职场文书
酒店管理求职信
2014/06/09 职场文书
另类冲刺标语
2014/06/24 职场文书
个人对照检查材料思想汇报(四风问题)
2014/09/25 职场文书
施工安全员岗位职责
2015/04/11 职场文书
入党群众意见范文
2015/06/02 职场文书