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 相关文章推荐
教你如何在Django 1.6中正确使用 Signal
Jun 22 Python
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
Mar 06 Python
在Python3中使用asyncio库进行快速数据抓取的教程
Apr 02 Python
Django自定义过滤器定义与用法示例
Mar 22 Python
Python浅复制中对象生存周期实例分析
Apr 02 Python
用python实现将数组元素按从小到大的顺序排列方法
Jul 02 Python
Python selenium页面加载慢超时的解决方案
Mar 18 Python
Pytorch转tflite方式
May 25 Python
python对 MySQL 数据库进行增删改查的脚本
Oct 22 Python
python 获取剪切板内容的两种方法
Nov 28 Python
python re.match()用法相关示例
Jan 27 Python
Python爬取奶茶店数据分析哪家最好喝以及性价比
Sep 23 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
PHP中操作ini配置文件的方法
2013/04/25 PHP
Yii2简单实现给表单添加验证码的方法
2016/07/18 PHP
PHP执行linux命令6个函数代码实例
2020/11/24 PHP
javascript下判断一个对象是否具有指定名称的属性的的代码
2010/01/11 Javascript
javascript 函数速查表
2010/02/07 Javascript
jquery1.4 教程二 ajax方法的改进
2010/02/25 Javascript
js事件冒泡实例分享(已测试)
2013/04/23 Javascript
jQuery之排序组件的深入解析
2013/06/19 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
2014/06/27 Javascript
node.js中 stream使用教程
2016/08/28 Javascript
Jquery Easyui自定义下拉框组件使用详解(21)
2020/12/31 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
JS实现购物车特效
2017/02/02 Javascript
js中的闭包学习心得
2018/02/06 Javascript
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
解决vue组件销毁之后计时器继续执行的问题
2020/07/21 Javascript
针对Vue路由history模式下Nginx后台配置操作
2020/10/22 Javascript
[08:53]DOTA2每周TOP10 精彩击杀集锦vol.9
2014/06/26 DOTA
python2 与python3的print区别小结
2018/01/16 Python
python实现随机调用一个浏览器打开网页
2018/04/21 Python
python redis 删除key脚本的实例
2019/02/19 Python
python 的 scapy库,实现网卡收发包的例子
2019/07/23 Python
基于python全局设置id 自动化测试元素定位过程解析
2019/09/04 Python
numpy ndarray 取出满足特定条件的某些行实例
2019/12/05 Python
Python实现在Windows平台修改文件属性
2020/03/05 Python
美国大尺码女装零售商:TORRID
2016/10/01 全球购物
Zatchels官网:英国剑桥包品牌
2021/01/12 全球购物
吃空饷专项治理工作实施方案
2014/03/04 职场文书
工厂仓管员岗位职责范本
2014/07/17 职场文书
交警作风整顿剖析材料
2014/10/11 职场文书
幸福家庭事迹材料
2014/12/20 职场文书
个人总结与自我评价
2015/02/14 职场文书
辞职信标准格式
2015/02/27 职场文书
技术员个人工作总结
2015/03/03 职场文书
Django展示可视化图表的多种方式
2021/04/08 Python
pytorch 中autograd.grad()函数的用法说明
2021/05/12 Python