在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实现字符串与数组相互转换功能示例
Sep 22 Python
Python 中字符串拼接的多种方法
Jul 30 Python
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
Jun 19 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
Jul 22 Python
Django ORM 聚合查询和分组查询实现详解
Aug 09 Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
Sep 15 Python
python3常用的数据清洗方法(小结)
Oct 31 Python
Python3实现建造者模式的示例代码
Jun 28 Python
pycharm 添加解释器的方法步骤
Aug 31 Python
PyQt实现计数器的方法示例
Jan 18 Python
opencv实现图像平移效果
Mar 24 Python
详细介绍python类及类的用法
May 31 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获得当前的脚本网址
2007/12/10 PHP
PHP利用header跳转失效的解决方法
2014/10/24 PHP
Discuz论坛密码与密保加密规则
2016/12/19 PHP
JS弹出窗口代码大全(详细整理)
2012/12/21 Javascript
jQuery实现动态添加和删除一个div
2015/08/12 Javascript
深入浅析JavaScript字符串操作方法 slice、substr、substring及其IE兼容性
2015/12/16 Javascript
JS显示日历和天气的方法
2016/03/01 Javascript
JS给swf传参数的实现方法
2016/09/13 Javascript
nodejs调取微信收货地址的方法
2017/12/20 NodeJs
Vue实现表格中对数据进行转换、处理的方法
2018/09/06 Javascript
JavaScript读写二进制数据的方法详解
2018/09/09 Javascript
Javascript中的this,bind和that使用实例
2019/12/05 Javascript
JavaScript switch语句使用方法简介
2019/12/30 Javascript
Vue 中 template 有且只能一个 root的原因解析(源码分析)
2020/04/11 Javascript
jQuery实现倒计时功能完整示例
2020/06/01 jQuery
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
使用Python的Flask框架表单插件Flask-WTF实现Web登录验证
2016/07/12 Python
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
2017/03/16 Python
通过python+selenium3实现浏览器刷简书文章阅读量
2017/12/26 Python
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
基于Django signals 信号作用及用法详解
2020/03/28 Python
如何基于python实现年会抽奖工具
2020/10/20 Python
aden + anais官方网站:婴儿襁褓、毯子、尿布和服装
2017/06/21 全球购物
7 For All Mankind官网:美国加州洛杉矶的高级牛仔服装品牌
2018/12/20 全球购物
香港家用健身器材、运动器材及健康美容仪器专门店:FitBoxx
2019/12/05 全球购物
关于Assembly命名空间的三个面试题
2015/07/23 面试题
护士检查书
2014/01/17 职场文书
财务人员的自我评价范文
2014/03/03 职场文书
外贸员简历中的自我评价
2014/03/04 职场文书
廉洁校园实施方案
2014/05/25 职场文书
企业活动策划方案
2014/06/02 职场文书
酒店总经理岗位职责范本
2014/08/08 职场文书
2015新年联欢晚会开场白
2014/12/14 职场文书
死亡赔偿协议书
2015/01/28 职场文书
财务出纳岗位职责
2015/03/31 职场文书
Nginx的rewrite模块详解
2021/03/31 Servers