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删除nginx缓存文件示例(python文件操作)
Mar 26 Python
python编程实现归并排序
Apr 14 Python
Python排序搜索基本算法之归并排序实例分析
Dec 08 Python
Python2中文处理纪要的实现方法
Mar 10 Python
pandas对指定列进行填充的方法
Apr 11 Python
Python IDLE清空窗口的实例
Jun 25 Python
Python多线程处理实例详解【单进程/多进程】
Jan 30 Python
PythonWeb项目Django部署在Ubuntu18.04腾讯云主机上
Apr 01 Python
python保留小数位的三种实现方法
Jan 07 Python
解决TensorFlow GPU版出现OOM错误的问题
Feb 03 Python
Python如何把Spark数据写入ElasticSearch
Apr 18 Python
python 解决pycharm运行py文件只有unittest选项的问题
Sep 01 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
window.open 以post方式传递参数示例代码
2014/02/27 Javascript
一个判断抢购时间是否到达的简单的js函数
2014/06/23 Javascript
JS实现动态移动层及拖动浮层关闭的方法
2015/04/30 Javascript
js中substr,substring,indexOf,lastIndexOf,split,replace的用法详解
2015/11/09 Javascript
JS之相等操作符详解
2016/09/13 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
2016/11/07 Javascript
jQuery+ajax的资源回收处理机制分析
2017/01/07 Javascript
Thinkjs3新手入门之如何使用静态资源目录
2017/12/06 Javascript
ES6中let 和 const 的新特性
2018/09/03 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
2019/06/03 Javascript
vue.js实现数据库的JSON数据输出渲染到html页面功能示例
2019/08/03 Javascript
layui--js控制switch的切换方法
2019/09/03 Javascript
vue+webpack 更换主题N种方案优劣分析
2019/10/28 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
2019/11/07 Javascript
WEB前端性能优化的7大手段详解
2020/02/04 Javascript
微信小程序自定义弹出模态框禁止底部滚动功能
2020/03/09 Javascript
[01:32]DOTA2 2015国际邀请赛中国区预选赛第四日战报
2015/05/29 DOTA
如何处理Python3.4 使用pymssql 乱码问题
2016/01/08 Python
Python处理文本文件中控制字符的方法
2017/02/07 Python
django使用html模板减少代码代码解析
2017/12/12 Python
python3.6.3转化为win-exe文件发布的方法
2018/10/31 Python
pytorch 状态字典:state_dict使用详解
2020/01/17 Python
使用PyTorch实现MNIST手写体识别代码
2020/01/18 Python
keras的ImageDataGenerator和flow()的用法说明
2020/07/03 Python
详解Canvas实用库Fabric.js使用手册
2019/01/07 HTML / CSS
Dockers鞋官网:Dockers Shoes
2018/11/13 全球购物
Linux机考试题
2015/07/17 面试题
人事档案接收函
2014/01/12 职场文书
机电一体化专业毕业生自荐信
2014/06/19 职场文书
卖车协议书范本4篇
2014/10/01 职场文书
查摆问题自查报告范文
2014/10/13 职场文书
中秋节随笔
2015/08/15 职场文书
《生物入侵者》教学反思
2016/02/16 职场文书
Python Pandas知识点之缺失值处理详解
2021/05/11 Python
MySQL数据库完全卸载的方法
2022/03/03 MySQL
Java生成日期时间存入Mysql数据库的实现方法
2022/03/03 Java/Android