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和perl实现批量对目录下电子书文件重命名的代码分享
Nov 21 Python
Python with用法实例
Apr 14 Python
python魔法方法-属性访问控制详解
Jul 25 Python
对numpy Array [: ,] 的取值方法详解
Jul 02 Python
matplotlib调整子图间距,调整整体空白的方法
Aug 03 Python
使用python切片实现二维数组复制示例
Nov 26 Python
pytorch 指定gpu训练与多gpu并行训练示例
Dec 31 Python
基于python检查SSL证书到期情况代码实例
Apr 04 Python
python 如何设置守护进程
Oct 29 Python
Python字符串的15个基本操作(小结)
Feb 03 Python
Python 中数组和数字相乘时的注意事项说明
May 10 Python
python疲劳驾驶困倦低头检测功能的实现
Apr 04 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网页游戏学习之Xnova(ogame)源码解读(十一)
2014/06/25 PHP
CodeIgniter配置之routes.php用法实例分析
2016/01/19 PHP
PHP基本语法实例总结
2016/09/09 PHP
PHP7生产环境队列Beanstalkd用法详解
2020/05/19 PHP
PHP的imageTtfText()函数深入详解
2021/03/03 PHP
JS实多级联动下拉菜单类,简单实现省市区联动菜单!
2007/05/03 Javascript
使用自定义setTimeout和setInterval使之可以传递参数和对象参数
2009/04/24 Javascript
jquery ready函数源代码研究
2009/12/06 Javascript
javascript编码的几个方法详细介绍
2013/01/06 Javascript
js实现的常用的左侧导航效果
2013/10/17 Javascript
jquery.post用法之type设置问题
2014/02/24 Javascript
js中settimeout方法加参数的使用实例
2014/02/27 Javascript
Jquery节点遍历next与nextAll方法使用示例
2014/07/22 Javascript
JavaScript声明变量时为什么要加var关键字
2014/09/29 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
2019/06/13 Javascript
利用JS代码自动删除稿件的普通弹幕功能
2019/09/20 Javascript
浅谈Vue SSR中的Bundle的具有使用
2019/11/21 Javascript
JavaScript的一些小技巧分享
2021/01/06 Javascript
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
2015/04/24 Python
Swift中的协议(protocol)学习教程
2016/07/08 Python
Python绑定方法与非绑定方法详解
2017/08/18 Python
Python循环实现n的全排列功能
2019/09/16 Python
深入浅析Python科学计算库Scipy及安装步骤
2019/10/12 Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
2020/10/12 Python
IE滤镜与CSS3效果(详细整理分享)
2013/01/25 HTML / CSS
德国2018年度最佳在线药房:Bodfeld Apotheke
2019/11/04 全球购物
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
小学运动会入场式解说词
2014/02/18 职场文书
班长演讲稿范文
2014/04/24 职场文书
教师党员个人自我剖析材料
2014/09/29 职场文书
六年级学生期末评语
2014/12/26 职场文书
初中班主任教育随笔
2015/08/15 职场文书
2016习总书记系列重要讲话心得体会
2016/01/15 职场文书
《雪域豹影》读后感:父爱的伟大
2019/12/23 职场文书
使用SQL实现车流量的计算的示例代码
2022/02/28 SQL Server
从原生JavaScript到React深入理解
2022/07/23 Javascript