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脚本生成sitemap.xml的实现方法
Jan 31 Python
Python基于多线程实现抓取数据存入数据库的方法
Jun 22 Python
python实现多进程代码示例
Oct 31 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
Feb 03 Python
Pytorch中的自动求梯度机制和Variable类实例
Feb 29 Python
python构造IP报文实例
May 05 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
Jun 14 Python
一文详述 Python 中的 property 语法
Sep 01 Python
Django怎么在admin后台注册数据库表
Nov 14 Python
pycharm 实现调试窗口恢复
Feb 05 Python
pytorch下的unsqueeze和squeeze的用法说明
Feb 06 Python
Python 如何利用ffmpeg 处理视频素材
Nov 27 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之第三天
2006/10/09 PHP
PHP 和 MySQL 基础教程(三)
2006/10/09 PHP
php发送邮件的问题详解
2015/06/22 PHP
PHP判断是否连接上网络的方法
2015/07/01 PHP
php-fpm中max_children的配置
2019/03/15 PHP
Alliance vs AM BO3 第二场2.13
2021/03/10 DOTA
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
JQuery 学习笔记 element属性控制
2009/07/23 Javascript
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
2009/11/28 Javascript
javascript中利用数组实现的循环队列代码
2010/01/24 Javascript
jQuery的链式调用浅析
2010/12/03 Javascript
8款非常棒的响应式jQuery 幻灯片插件推荐
2012/02/02 Javascript
jQuery创建平滑的页面滚动(顶部或底部)
2013/02/26 Javascript
getComputedStyle与currentStyle获取样式(style/class)
2013/03/19 Javascript
window.showModalDialog参数传递中含有特殊字符的处理方法
2013/06/06 Javascript
JavaScript面向对象程序设计教程
2016/03/29 Javascript
JS HTML5拖拽上传图片预览
2016/07/18 Javascript
基于JavaScript定位当前的地理位置
2017/04/11 Javascript
学习React中ref的两个demo示例
2018/08/14 Javascript
详解关于Vue2.0路由开启keep-alive时需要注意的地方
2018/09/18 Javascript
angular多语言配置详解
2019/05/16 Javascript
Vue和React有哪些区别
2020/09/12 Javascript
浅谈javascript事件环微任务和宏任务队列原理
2020/09/12 Javascript
python使用线程封装的一个简单定时器类实例
2015/05/16 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
2017/11/22 Python
CSS3 transforms应用于背景图像的解决方法
2019/04/16 HTML / CSS
HTML5 canvas基本绘图之图形组合
2016/06/27 HTML / CSS
主管会计岗位职责
2014/03/13 职场文书
《山谷中的谜底》教学反思
2014/04/26 职场文书
入党转正申请报告
2015/05/15 职场文书
中学团支部工作总结
2015/08/13 职场文书
2016年学校“3.12”植树节活动总结
2016/03/16 职场文书
2016年第十四个公民道德宣传日活动总
2016/04/01 职场文书
用Python监控你的朋友都在浏览哪些网站?
2021/05/27 Python
python 开心网和豆瓣日记爬取的小爬虫
2021/05/29 Python
SQL SERVER触发器详解
2022/02/24 SQL Server