Django框架中方法的访问和查找


Posted in Python onJuly 15, 2015

在 Django 模板中遍历复杂数据结构的关键是句点字符 (.)。

最好是用几个例子来说明一下。 比如,假设你要向模板传递一个 Python 字典。 要通过字典键访问该字典的值,可使用一个句点:

>>> from django.template import Template, Context
>>> person = {'name': 'Sally', 'age': '43'}
>>> t = Template('{{ person.name }} is {{ person.age }} years old.')
>>> c = Context({'person': person})
>>> t.render(c)
u'Sally is 43 years old.'

同样,也可以通过句点来访问对象的属性。 比方说, Python 的 datetime.date 对象有 year 、 month 和 day 几个属性,你同样可以在模板中使用句点来访问这些属性:

>>> from django.template import Template, Context
>>> import datetime
>>> d = datetime.date(1993, 5, 2)
>>> d.year
1993
>>> d.month
5
>>> d.day
2
>>> t = Template('The month is {{ date.month }} and the year is {{ date.year }}.')
>>> c = Context({'date': d})
>>> t.render(c)
u'The month is 5 and the year is 1993.'

这个例子使用了一个自定义的类,演示了通过实例变量加一点(dots)来访问它的属性,这个方法适用于任意的对象。

>>> from django.template import Template, Context
>>> class Person(object):
...  def __init__(self, first_name, last_name):
...   self.first_name, self.last_name = first_name, last_name
>>> t = Template('Hello, {{ person.first_name }} {{ person.last_name }}.')
>>> c = Context({'person': Person('John', 'Smith')})
>>> t.render(c)
u'Hello, John Smith.'

点语法也可以用来引用对象的* 方法*。 例如,每个 Python 字符串都有 upper() 和 isdigit() 方法,你在模板中可以使用同样的句点语法来调用它们:

>>> from django.template import Template, Context
>>> t = Template('{{ var }} -- {{ var.upper }} -- {{ var.isdigit }}')
>>> t.render(Context({'var': 'hello'}))
u'hello -- HELLO -- False'
>>> t.render(Context({'var': '123'}))
u'123 -- 123 -- True'

注意这里调用方法时并* 没有* 使用圆括号 而且也无法给该方法传递参数;你只能调用不需参数的方法。 (我们将在本章稍后部分解释该设计观。)

最后,句点也可用于访问列表索引,例如:

>>> from django.template import Template, Context
>>> t = Template('Item 2 is {{ items.2 }}.')
>>> c = Context({'items': ['apples', 'bananas', 'carrots']})
>>> t.render(c)
u'Item 2 is carrots.'

不允许使用负数列表索引。 像 {{ items.-1 }} 这样的模板变量将会引发`` TemplateSyntaxError``

Python 列表类型

一点提示: Python的列表是从0开始索引。 第一项的索引是0,第二项的是1,依此类推。

句点查找规则可概括为: 当模板系统在变量名中遇到点时,按照以下顺序尝试进行查找:

  •     字典类型查找 (比如 foo["bar"] )
  •     属性查找 (比如 foo.bar )
  •     方法调用 (比如 foo.bar() )
  •     列表类型索引查找 (比如 foo[bar] )

系统使用找到的第一个有效类型。 这是一种短路逻辑。

句点查找可以多级深度嵌套。 例如在下面这个例子中 {{person.name.upper}} 会转换成字典类型查找( person['name'] ) 然后是方法调用( upper() ):

>>> from django.template import Template, Context
>>> person = {'name': 'Sally', 'age': '43'}
>>> t = Template('{{ person.name.upper }} is {{ person.age }} years old.')
>>> c = Context({'person': person})
>>> t.render(c)
u'SALLY is 43 years old.'
Python 相关文章推荐
Python实现豆瓣图片下载的方法
May 25 Python
基于python的七种经典排序算法(推荐)
Dec 08 Python
python字符串的方法与操作大全
Jan 30 Python
python中利用zfill方法自动给数字前面补0
Apr 10 Python
python 批量修改/替换数据的实例
Jul 25 Python
Python numpy.array()生成相同元素数组的示例
Nov 12 Python
python 限制函数执行时间,自己实现timeout的实例
Jan 12 Python
Python多线程及其基本使用方法实例分析
Oct 29 Python
Window系统下Python如何安装OpenCV库
Mar 05 Python
使用Django清空数据库并重新生成
Apr 03 Python
Python爬虫基础之爬虫的分类知识总结
May 13 Python
Python快速优雅的批量修改Word文档样式
May 20 Python
Python的Django框架中的Context使用
Jul 15 #Python
在Python的Django框架中创建和使用模版
Jul 15 #Python
详解Python的Django框架中的模版相关知识
Jul 15 #Python
Django中处理出错页面的方法
Jul 15 #Python
在Django中创建动态视图的教程
Jul 15 #Python
Python的Django框架中的URL配置与松耦合
Jul 15 #Python
Django查找网站项目根目录和对正则表达式的支持
Jul 15 #Python
You might like
咖啡的种类和口感
2021/03/03 新手入门
模拟xcopy的函数
2006/10/09 PHP
PHP+Mysql+jQuery实现动态展示信息
2011/10/08 PHP
php操作xml
2013/10/27 PHP
Apache服务器下防止图片盗链的办法
2015/07/06 PHP
用JS实现一个页面多个css样式实现
2008/05/29 Javascript
js 鼠标点击事件及其它捕获
2009/06/04 Javascript
jQuery DOM操作实例
2014/03/05 Javascript
Vue.js实现拖放效果的实例
2016/09/30 Javascript
浅谈jquery中next与siblings的区别
2016/10/27 Javascript
基于bootstrap风格的弹框插件
2016/12/28 Javascript
Js apply方法详解
2017/02/16 Javascript
jQuery EasyUI Panel面板组件使用详解
2017/02/28 Javascript
JS实现微信摇一摇原理解析
2017/07/22 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
2018/09/16 Javascript
Vue中JS动画与Velocity.js的结合使用
2019/02/13 Javascript
微信小程序学习笔记之表单提交与PHP后台数据交互处理图文详解
2019/03/28 Javascript
JavaScript实现多张图片放大镜效果示例【不限定图片尺寸,rem单位】
2019/05/14 Javascript
Vue学习笔记之计算属性与侦听器用法
2019/12/07 Javascript
js实现拖拽与碰撞检测
2020/09/18 Javascript
python的pdb调试命令的命令整理及实例
2017/07/12 Python
python3使用SMTP发送简单文本邮件
2018/06/19 Python
python使用PIL模块获取图片像素点的方法
2019/01/08 Python
python矩阵/字典实现最短路径算法
2019/01/17 Python
Python中请不要再用re.compile了
2019/06/30 Python
详解python中eval函数的作用
2019/10/22 Python
python代码中怎么换行
2020/06/17 Python
美国顶级品牌男士大码服装店:DXL
2017/08/30 全球购物
统计员岗位职责
2013/11/14 职场文书
精细化工应届生求职信
2013/11/17 职场文书
抗洪抢险事迹材料
2014/05/06 职场文书
记账会计岗位职责
2014/06/16 职场文书
婚前财产协议书范本
2014/10/19 职场文书
TypeScript中条件类型精读与实践记录
2021/10/05 Javascript
Redis高并发缓存架构性能优化
2022/05/15 Redis
winserver2019安装软件一直卡在应用程序正在为首次使用做准备
2022/06/10 Servers