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压缩和解压缩zip文件
Feb 14 Python
Python数组定义方法
Apr 13 Python
python之Socket网络编程详解
Sep 29 Python
python使用两种发邮件的方式smtp和outlook示例
Jun 02 Python
python编程实现12306的一个小爬虫实例
Dec 27 Python
Python实现的多进程和多线程功能示例
May 29 Python
对python中xlsx,csv以及json文件的相互转化方法详解
Dec 25 Python
Python编程深度学习计算库之numpy
Dec 28 Python
Python中字符串与编码示例代码
May 20 Python
Python 根据日志级别打印不同颜色的日志的方法示例
Aug 08 Python
python防止随意修改类属性的实现方法
Aug 21 Python
Python reques接口测试框架实现代码
Jul 28 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
PHP5 字符串处理函数大全
2010/03/23 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
2014/04/10 PHP
PHP错误Warning:mysql_query()解决方法
2015/10/24 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
2017/12/13 PHP
PHP下载大文件失败并限制下载速度的实例代码
2019/05/10 PHP
让插入到 innerHTML 中的 script 跑起来的实现代码
2006/07/01 Javascript
jQuery之尺寸调整组件的深入解析
2013/06/19 Javascript
JS中for循序中延迟加载动态效果的具体实现
2013/08/18 Javascript
jquery常用方法及使用示例汇总
2014/11/08 Javascript
详解参数传递四种形式
2015/07/21 Javascript
javascript实现数字倒计时特效
2016/03/30 Javascript
去除字符串左右两边的空格(实现代码)
2016/05/12 Javascript
JS从数组中随机取出几个数组元素的方法
2016/08/02 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/10/05 Javascript
Vue如何引入远程JS文件
2017/04/20 Javascript
3种vue组件的书写形式
2017/11/29 Javascript
Vue.js的复用组件开发流程完整记录
2018/11/29 Javascript
关于vue路由缓存清除在main.js中的设置
2019/11/06 Javascript
vue 输入电话号码自动按3-4-4分割功能的实现代码
2020/04/30 Javascript
react-intl实现React国际化多语言的方法
2020/09/27 Javascript
[03:56]DOTA2完美大师赛趣味视频之小鸽子和Mineski打台球
2017/11/24 DOTA
Python中用于返回绝对值的abs()方法
2015/05/14 Python
基于python yield机制的异步操作同步化编程模型
2016/03/18 Python
python+Django+apache的配置方法详解
2016/06/01 Python
Python操作Word批量生成合同的实现示例
2020/08/28 Python
美特斯邦威官方商城:邦购网
2016/10/13 全球购物
英国卫浴商店:Ergonomic Design
2019/09/22 全球购物
成人教育自我鉴定
2013/11/01 职场文书
大学学习个人的自我评价
2014/02/18 职场文书
民政局办理协议离婚(范本)
2014/10/25 职场文书
普通员工辞职信范文
2015/05/12 职场文书
答谢酒会主持词
2015/07/02 职场文书
2016年寒假见闻
2015/10/10 职场文书
信息技术研修心得体会
2016/01/08 职场文书
如何拟写通知正文?
2019/04/02 职场文书
假期读书倡议书3篇
2019/08/19 职场文书