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实现ipsec开权限实例
Nov 11 Python
python实现一次创建多级目录的方法
May 15 Python
Python中input与raw_input 之间的比较
Aug 20 Python
Python语言实现百度语音识别API的使用实例
Dec 13 Python
python绘制条形图方法代码详解
Dec 19 Python
Python关于excel和shp的使用在matplotlib
Jan 03 Python
Python线程协作threading.Condition实现过程解析
Mar 12 Python
使用Django搭建网站实现商品分页功能
May 22 Python
Python bisect模块原理及常见实例
Jun 17 Python
Python Django搭建文件下载服务器的实现
May 10 Python
Python OpenCV 图像平移的实现示例
Jun 04 Python
Python anaconda安装库命令详解
Oct 16 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
DOTA2 玩家自创拉野攻略 特色英雄快速成长篇
2020/04/20 DOTA
php自动获取目录下的模板的代码
2010/08/08 PHP
php下清空字符串中的HTML标签的代码
2010/09/06 PHP
yii添删改查实例
2015/11/16 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
JavaScript方法和技巧大全
2006/12/27 Javascript
实现png图片和png背景透明(支持多浏览器)的方法
2009/09/08 Javascript
javascript实现div的显示和隐藏的小例子
2013/06/25 Javascript
JavaScript比较两个对象是否相等的方法
2015/02/06 Javascript
jquery实现聚光灯效果的方法
2015/02/06 Javascript
极易被忽视的javascript面试题七问七答
2016/02/15 Javascript
JS中使用变量保存arguments对象的方法
2016/06/03 Javascript
JavaScript禁止用户多次提交的两种方法
2016/07/24 Javascript
ES6新特性三: Generator(生成器)函数详解
2017/04/21 Javascript
微信小程序实现倒计时60s获取验证码
2020/04/17 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
详解JavaScript中操作符和表达式
2018/09/12 Javascript
JavaScript 高性能数组去重的方法
2018/09/20 Javascript
vue中子组件传递数据给父组件的讲解
2019/01/27 Javascript
vue 路由懒加载中给 Webpack Chunks 命名的方法
2020/04/24 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
2020/07/26 Javascript
js实现页面导航层级指示效果
2020/08/25 Javascript
[37:03]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第二场 12.16
2020/12/18 DOTA
python使用BeautifulSoup分页网页中超链接的方法
2015/04/04 Python
Python编程判断这天是这一年第几天的方法示例
2017/04/18 Python
pygame游戏之旅 按钮上添加文字的方法
2018/11/21 Python
python实现剪切功能
2019/01/23 Python
python设计tcp数据包协议类的例子
2019/07/23 Python
在pytorch中为Module和Tensor指定GPU的例子
2019/08/19 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
2020/02/17 Python
Python模拟登入的N种方式(建议收藏)
2020/05/31 Python
HTML5拖放效果的实现代码
2016/11/17 HTML / CSS
阿迪达斯荷兰官方网站:adidas荷兰
2018/03/16 全球购物
健康教育评估方案
2014/05/25 职场文书
情侣餐厅的创业计划书范本!
2019/07/26 职场文书
世界文化遗产导游词
2019/08/07 职场文书