[Dynamic Language] Python Django: 模板引擎(1)基本使用
Django 模板系统
模板是一个文本,用于分离文档的表现形式和内容。 模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签)。
模板通常用于产生HTML,但是Django的模板也能产生任何基于文本格式的文档。
使用 Django 的设置启动交互解释器
python manage.py shell
Django搜索DJANGO_SETTINGS_MODULE环境变量,它被设置在settings.py中当你运行命令:python manage.py shell.
它将自动帮你处理DJANGO_SETTINGS_MODULE。
模板的使用
代码
In [1]: from django import template //导入模板类
In [2]: t = template.Template('My name is {{name}}.') // 创建模板代码
In [4]: c = template.Context({'name':'ABeen'}) // 创建模板内容
In [5]: print t.render(c)
My name is ABeen.
In [6]: c = template.Context({'name':'Boy'})
In [7]: print t.render(c)
My name is Boy.
In [8]: from django.template import Context, Template
In [9]: t = Template('My name is {{ name}}.') // 创建模板代码对象
In [11]: c = Context({'name':'ABeen'}) // //创建模板内容对象
In [12]: t.render(c) // 填充模板
Out[12]: u'My name is ABeen.' // Django支持Unicode,这样我们的应用程序就可以轻松处理各式各样的字符集
// 同一模板,多个上下文
代码
In [13]: from django.template import Template, Context
In [14]: t = Template('Hello, {{name}}')
In [15]: print t.render(Context({'name':'ABeen'}))
Hello, ABeen
In [16]: print t.render(Context({'name':'ABeen2'}))
Hello, ABeen2
In [17]: print t.render(Context({'name':'奥本'}))
Hello, 奥本
In [18]: for name in ('abeen','shanshan','aoben'):
....: print t.render(Context({'name':name}))
Hello, abeen
Hello, shanshan
Hello, aoben
// 深度变量的查找
// 字典
代码
In [19]: person = {'name':'ABeen', 'Age': 24}
In [20]: t = Template('{{person.name}} is {{person.Age}} years old.')
In [21]: c = Context({'person': person})
In [22]: t.render(c)
Out[22]: u'ABeen is 24 years old.'
// 对象属性
代码
In [23]: import datetime
In [24]: from django.template import Template, Context
In [25]: d = datetime.datetime.now()
In [29]: t = Template('Year is {{date.year}}, Month is {{data.month}}, Day is {{date.day}}')
In [30]: c = Context({'date':d})
In [31]: t.render(c)
Out[31]: u'Year is 1982, Month is , Day is 27'
// 自定义对象
代码
In [32]: class Person(object):
....: def __init__(self, first_name, last_name):
....: self.first_name = first_name
....: self.last_name = last_name
In [33]: t = Template('Hello, {{ person.first_name }} {{ person.last_name }}.')
In [34]: c = Context({'person': Person('abeen','shanshan')})
In [35]: t.render(c)
Out[35]: u'Hello, abeen shanshan.'
// 引用对象的方法
In [36]: t = Template('{{ var }} -- {{ var.upper}} -- {{var.isdigit}}')
In [37]: t.render(Context({'var':'123'}))
Out[37]: u'123 -- 123 -- True'
注意这里调用方法没有使用圆括号,无法给方法传递参数;只能调用不需要参数的方法。
当模板系统在变量名中遇到句点时,按以下顺序进行查找:
1、字典类型查找(比如foo["bar"])
2、属性查找(比如foo.bar)
3、方法调用(比如foo.bar())
4、列表类型索引查找(比如foo[bar])
系统使用找到的第一个有效类型,这是一种短路逻辑。
//句点查找可以多级深度嵌套
比如下面先把{{person.name.upper}}转化成字典类型查找person['name'],然后再是方法调用upper()。
代码
In [1]: from django.template import Template, Context
In [2]: person = {'name': 'ABeen', 'age': 24}
In [3]: t = Template('{{person.name.upper}} is {{person.age}}')
In [4]: c = Context({'person': person})
In [5]: t.render(c)
Out[5]: u'ABEEN is 24'
//默认情况下,如果一个变量不存在,模板系统会把它展示为空字符串,不做任何事情来表示失败
In [17]: t = Template('My name is {{name}}.')
In [18]: t.render(Context())
Out[18]: u'My name is .'
In [19]: t.render(Context({'var':'hello'}))
Out[19]: u'My name is .'