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定时采集摄像头图像上传ftp服务器功能实现
Dec 23 Python
星球大战与Python之间的那些事
Jan 07 Python
python妙用之编码的转换详解
Apr 21 Python
Python 迭代器与生成器实例详解
May 18 Python
python实现守护进程、守护线程、守护非守护并行
May 05 Python
python opencv判断图像是否为空的实例
Jan 26 Python
Python弹出输入框并获取输入值的实例
Jun 18 Python
详解python破解zip文件密码的方法
Jan 13 Python
在Python中通过threshold创建mask方式
Feb 19 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
Apr 30 Python
python实现三次密码验证的示例
Apr 29 Python
Python使用openpyxl模块处理Excel文件
Jun 05 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学习之运算符相关概念
2011/06/09 PHP
PHP二维数组排序的3种方法和自定义函数分享
2014/04/09 PHP
PHP中的traits简单使用实例
2015/05/13 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
2016/09/11 PHP
Laravel源码解析之路由的使用和示例详解
2018/09/27 PHP
php实现简易计算器
2020/08/28 PHP
js实现addClass,removeClass,hasClass的函数代码
2011/07/13 Javascript
jquery 倒计时效果实现秒杀思路
2013/09/11 Javascript
jQuery 中$(this).index与$.each的使用指南
2014/11/20 Javascript
jQuery实现checkbox全选的方法
2015/06/10 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
整理Javascript基础语法学习笔记
2015/11/29 Javascript
vue.js入门教程之基础语法小结
2016/09/01 Javascript
Angular 理解module和injector,即依赖注入
2016/09/07 Javascript
javascript表单正则应用
2017/02/04 Javascript
基于JS实现仿京东搜索栏随滑动透明度渐变效果
2017/07/10 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
js数组方法reduce经典用法代码分享
2018/01/07 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
2018/12/25 Javascript
微信小程序基于ColorUI构建皮皮虾短视频去水印组件
2020/11/04 Javascript
使用Vant完成Dialog弹框案例
2020/11/11 Javascript
Flask实现图片的上传、下载及展示示例代码
2018/08/03 Python
Python中文编码知识点
2019/02/18 Python
python实现广度优先搜索过程解析
2019/10/19 Python
原生 JS+CSS+HTML 实现时序图的方法
2019/07/31 HTML / CSS
巴西宠物店在线:Geração Pet
2017/05/31 全球购物
台湾旅游网站:雄狮旅游网
2017/08/16 全球购物
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
房地产开盘策划方案
2014/02/10 职场文书
促销活动总结怎么写
2014/06/25 职场文书
先进党支部申报材料
2014/12/24 职场文书
2015年度酒店客房部工作总结
2015/05/25 职场文书
谢师宴学生致辞
2015/07/27 职场文书
前端学习——JavaScript原生实现购物车案例
2021/03/31 Javascript
Golang表示枚举类型的详细讲解
2021/09/04 Golang
css常用字体属性与背景属性介绍
2022/02/28 HTML / CSS