Django模板是一些文本字符串,作用是把文档表现与数据分开,通常模板用于生成HTML,Django模板可以生成任何基于文档的格式。
Django模板不是把Python代码嵌入HTML这么简单,其目的是呈现,不是表现逻辑。
Django自带了内置后端,用于支持自身的模板引擎————Django Template Langeuage(DTL)
Django1.8还支持另一个模板引擎jinja2
下面说一下DTL的工作方式
1.以字符串形式提供原始模板代码,创建Template对象。
2.在Template 对象上调用render()方法,传入一系列变量
创建Template对象
在Terminal中输入
Python manage.py shell
接着输入
>>>from django.template import Template
>>>t = Template('my name is {{name}}.')
>>>print(t)
在交互解释器上会得到:
0x0373F4F0是Template对象的标识,创建Template对象时,模板系统会优化原始模板代码,但是如果模板代码中有错误,调用会导致TemplateSyntaxError 异常抛出:
>>> from django.template import Template
>>> t = Template('{% notatag %}')
Traceback (most recent call last):
File "", line 1, in ?
...
django.template.base.TemplateSyntaxError: Invalid block tag: 'notatag'
block tag(块级标签)指的是{% notatag %}
以下情况都会抛出TemplateSyntaxError
• 无效标签
• 有效标签的无效参数
• 无效过滤器
• 有效过滤器的无效参数
• 无效模板句法
• 未关闭的标签
渲染模板
有了Template 对象之后,可以为其提供上下文,在Django中,使用 django.template 模块中的 Context 类表示,它的构造方法接受一个可选参数,一个字典,把变量名映射到值上,填充模板的方法是在Template模板上调用render()方法。
>>> from django.template import Context, Template
>>> t = Template('My name is {{ name }}.')
>>> c = Context({'name': 'pythony'})
>>> t.render(c)
'My name is pythony.'
字典和上下文
Python字典是键和值的映射。Context 对象类似于字典。
变量名必须以字母开头,随后可以跟字母,数字,下划线和点号,
多上下文,同个模板
Template对象可渲染多个上下文
>>> from django.template import Template, Context
>>> t = Template('Hello, {{ name }}')
>>> print (t.render(Context({'name': 'xiaoming'})))
Hello, xiaoming
>>> print (t.render(Context({'name': 'xiaohong '})))
Hello, xiaohong
>>> print (t.render(Context({'name': 'xiaoqiang'})))
Hello, xiaoqiang
用for一次输入多个上下文
for name in ('xiaoming', 'xiaohong ', 'xiaoqiang'):
t = Template('Hello, {{ name }}')
print (t.render(Context({'name': name})))
上下文的变量查找
模板系统可以处理很多复杂的数据结构,如列表,字典,和自定义对象
遍历Django模板中复杂数据的关键是点号(.)
点号可以访问字典的键,属性,方法或对象的索引
>>> from django.template import Template, Context
>>> person = {'name': 'xiaolong', 'age': '38'}
>>> t = Template('{{ person.name }} is {{
person.age
}} years old.')
>>> c = Context({'person': person})
>>> t.render(c)
'xiaolong is 38 years old.'
还可以通过点号访问对象的属性
>>>from django.template import Template,Context
>>>import datetime
>>>a = datetime.date(2017.5,1)
>>>a.year
2017
>>> t = Template('The month is {{ date.month }}
and the year is {{ date.year }}.')
>>> c = Context({'date': d})
>>> t.render(c)
'The month is 5 and the year is 2017.'
自定义一个类也可以通过点号访问任意对象的属性。也可以对一些方法进行调用,或者索引(不能进行负数索引,否则会抛出异常)。