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升级导致yum、pip报错的解决方法
Sep 06 Python
Python搜索引擎实现原理和方法
Nov 27 Python
Python实现接受任意个数参数的函数方法
Apr 21 Python
解决python3 json数据包含中文的读写问题
May 10 Python
python跳过第一行快速读取文件内容的实例
Jul 12 Python
Python列表推导式与生成器用法分析
Aug 02 Python
使用Python快乐学数学Github万星神器Manim简介
Aug 07 Python
Python线程条件变量Condition原理解析
Jan 20 Python
Python matplotlib画曲线例题解析
Feb 07 Python
python3中sys.argv的实例用法
Apr 24 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
Sep 29 Python
python自动化之如何利用allure生成测试报告
May 02 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基于base64解码图片与加密图片还原实例
2014/11/03 PHP
php函数与传递参数实例分析
2014/11/15 PHP
PHP扩展开发教程(总结)
2015/11/04 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
2016/09/22 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
详解laravel安装使用Passport(Api认证)
2018/07/27 PHP
javascript实现简单的鼠标拖动效果实例
2015/04/10 Javascript
jQuery树形下拉菜单特效代码分享
2015/08/15 Javascript
JS实现alert中显示换行的方法
2015/12/17 Javascript
JavaScript中push(),join() 函数 实例详解
2016/09/06 Javascript
Vue.js中兄弟组件之间互相传值实例
2017/06/01 Javascript
快速解决bootstrap下拉菜单无法隐藏的问题
2018/08/10 Javascript
vue实现带复选框的树形菜单
2019/05/27 Javascript
[01:07:21]NAVI vs VG Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
在Python的Tornado框架中实现简单的在线代理的教程
2015/05/02 Python
python中函数默认值使用注意点详解
2016/06/01 Python
Python使用迭代器捕获Generator返回值的方法
2017/04/05 Python
python+requests+unittest API接口测试实例(详解)
2017/06/10 Python
python实现海螺图片的方法示例
2019/05/12 Python
python文件转为exe文件的方法及用法详解
2019/07/08 Python
python3 tcp的粘包现象和解决办法解析
2019/12/09 Python
详解Pycharm出现out of memory的终极解决方法
2020/03/03 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
Python Tricks 使用 pywinrm 远程控制 Windows 主机的方法
2020/07/21 Python
python+openCV对视频进行截取的实现
2020/11/27 Python
CSS3实现的闪烁跳跃进度条示例(附源码)
2013/08/19 HTML / CSS
莫斯科购买书籍网站:Book24
2020/01/12 全球购物
Orlebar Brown官网:设计师泳裤和泳装
2020/12/08 全球购物
施工资料员的岗位职责
2013/12/22 职场文书
《三峡》教学反思
2014/03/01 职场文书
工地安全质量标语
2014/06/07 职场文书
三严三实·严以修身心得体会
2016/01/15 职场文书
python opencv人脸识别考勤系统的完整源码
2021/04/26 Python
Python卷积神经网络图片分类框架详解分析
2021/11/07 Python
Python采集壁纸并实现炫轮播
2022/04/30 Python