Django模板

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.'

自定义一个类也可以通过点号访问任意对象的属性。也可以对一些方法进行调用,或者索引(不能进行负数索引,否则会抛出异常)。

你可能感兴趣的:(django)