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算法学习之计数排序实例
Dec 18 Python
python正则匹配查询港澳通行证办理进度示例分享
Dec 27 Python
github配置使用指南
Nov 18 Python
Django中利用filter与simple_tag为前端自定义函数的实现方法
Jun 15 Python
Python常见工厂函数用法示例
Mar 21 Python
对Python中的@classmethod用法详解
Apr 21 Python
python实现简单的文字识别
Nov 27 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
Jul 11 Python
浅析python内置模块collections
Nov 15 Python
Python 中如何实现参数化测试的方法示例
Dec 10 Python
基于Python计算圆周率pi代码实例
Mar 25 Python
Django框架获取form表单数据方式总结
Apr 22 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
ftp类(myftp.php)
2006/10/09 PHP
Apache 配置详解(最好的APACHE配置教程)
2010/07/04 PHP
PHPExcel读取Excel文件的实现代码
2011/12/06 PHP
Zend Framework教程之分发器Zend_Controller_Dispatcher用法详解
2016/03/07 PHP
PHP 5.6.11 访问SQL Server2008R2的几种情况详解
2016/08/08 PHP
ThinkPHP6.0如何利用自定义验证规则规范的实现登陆
2020/12/16 PHP
修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
2009/10/11 Javascript
IE6浏览器中window.location.href无效的解决方法
2014/11/20 Javascript
jQuery中[attribute]选择器用法实例
2014/12/31 Javascript
js实现点击切换TAB标签实例
2015/08/21 Javascript
javascript数据类型验证方法
2015/12/31 Javascript
javascript类型系统——undefined和null全面了解
2016/07/13 Javascript
基于Bootstrap仿淘宝分页控件实现代码
2016/11/07 Javascript
详解基于angular路由的requireJs按需加载js
2017/01/20 Javascript
vue如何引用其他组件(css和js)
2017/04/13 Javascript
jQuery复合事件用法示例
2017/06/10 jQuery
微信小程序实现点击返回顶层的方法
2017/07/12 Javascript
JS对象序列化成json数据和json数据转化为JS对象的代码
2017/08/23 Javascript
基于DOM节点删除之empty和remove的区别(详解)
2017/09/11 Javascript
Vue实现自定义下拉菜单功能
2018/07/16 Javascript
基于Vue实现图片在指定区域内移动的思路详解
2018/11/11 Javascript
Vue2 添加数据可视化支持的方法步骤
2019/01/02 Javascript
JS call()及apply()方法使用实例汇总
2020/07/11 Javascript
Django基础之Model操作步骤(介绍)
2017/05/27 Python
解决python 上传图片限制格式问题
2019/10/30 Python
Django多进程滚动日志问题解决方案
2019/12/17 Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
2020/01/03 Python
Python实现多线程下载脚本的示例代码
2020/04/03 Python
Python classmethod装饰器原理及用法解析
2020/10/17 Python
CSS3实现可翻转的hover效果
2018/05/23 HTML / CSS
党校培训思想汇报
2014/01/03 职场文书
北京奥运会主题口号
2014/06/13 职场文书
人生遥控器观后感
2015/06/11 职场文书
环保主题班会教案
2015/08/13 职场文书
竞聘开场白方式有哪些?
2019/08/28 职场文书
Android超详细讲解组件ScrollView的使用
2022/03/31 Java/Android