Django 项目可以配置一个或多个模板引擎(甚至是零,如果你不需要使用模板)。Django 的模板系统自带内建的后台 —— 称为Django 模板语言(DTL),以及另外一种流行的Jinja2。其他的模板语言的后端,可查找第三方库。
配置
模板引擎通过TEMPLATES 设置来配置。它是一个设置选项列表,与引擎一一对应。默认的值为空。由startproject 命令生成的settings.py 定义了一些有用的值:
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { # ... some options here ... }, }, ]
加载模板
get_template('news/story_detail.html')
Django模板语言
Django模板是一个简单的文本文档,或用Django模板语言标记的一个Python字符串。 某些结构是被模板引擎解释和识别的。主要的有变量和标签。模板是由context来进行渲染的。渲染的过程是用在context中找到的值来替换模板中相应的变量,并执行相关tags。其他的一切都原样输出。Django模板语言的语法包括四个结构。
变量
变量的值是来自context中的输出, 这类似于字典对象的keys到values的映射关系。
变量是被 {{ 和 }}括起来的部分,例如:
My first name is {{ first_name }}. My last name is {{ last_name }}.
字典查询,属性查询和列表索引查找都是通过一个点符号来实现:
{{ my_dict.key }} {{ my_object.attribute }} {{ my_list.0 }}
模板中的脚本元素
模板中的脚本元素有3种:
if/elif/else/endif
语法:
{% if condition1 %}
display 1
{% elif condiiton2 %}
display 2
{% else %}
display 3
{% endif %}
根据条件来判断显示的内容,可以使用and,or和not运算符,变量将从上下文中寻找。
for
for允许迭代某一对象,模板引擎将会渲染其中的内容
{% for item in iterable %}
<p>{{ item }}</p>
{% endfor %}
示例:
{% for item in a_list %}
<p>{{ item }}</p>
{% endfor %}
a_list必须从context中搜索,模板引擎不支持定义iterable。下列示例将产生语法错误:
{% for item in ['1','2'] %}
<p>{{ item }}</p>
{% endfor %}
支持reversed关键字和嵌套使用:
{% for item in iterable reversed %}
ifequal/ifnotequal
类似{%if%}标签,但可方便的进行比较:
{% ifequal obj1 obj2 %}
display 1
{% else %}
display 3
{% endifequal %}
等价于:
{% if obj1 == obj2 %}
display 1
{% else %}
display 2
{% endif %}
类似地,有ifnotequal:
{% ifnotequal obj1 obj2 %}
display 1
{% else %}
display 2
{% endifnotequal %}
def businesshours(value): try: return 9 <= value.hour < 17 except AttributeError: return
标签
标签在渲染的过程中提供任意的逻辑。这个定义是刻意模糊的。例如,一个标签可以输出内容,作为控制结构,例如“if”语句或“for”循环从数据库中提取内容,甚至可以访问其他的模板标签。
Tags是由{%和 %} 来定义的,例如:
{% csrf_token %}
{% url 'some-url-name' v1 v2 %}
过滤器
过滤器会更改变量或标签参数的值。看上去像这样:
{{ django|title }}
{{ a_list|first|upper }}
上述示例中first
过滤器首先取出a_list的首元素,然后由upper
过滤器将其转化为大写。
add
把add后的参数加给value
addslashes
在引号前面加上斜杆。例如,用于在CSV中转义字符串。
capfirst
大写变量的第一个字母。如果第一个字符不是字母,该过滤器将不会生效。
cut
移除value中所有的与给出的变量相同的字符串
date
根据给定格式对一个date变量格式化
default
如果value的计算结果为False,则使用给定的默认值。否则,使用该value。
dictsort
接受一个字典列表,并返回按参数中给出的键排序后的列表。
具体可以查看 内置过滤器参考和 开发自定义过滤器指南这两篇文档.
include模板
{% include 'included.html' %}
标签允许在模板中包含其它的模板的内容。
模板继承
模板可以通过继承来实现复用。首先编写base.html
<html>
<head>
<title>Hello World!</title>
</head>
<body>
{% block mainbody %}
<p>base</p>
{% endblock %}
</body>
</html>
{% block %}
标签通知模板引擎,子模板可以重写这些部分。
{% extends "base.html" %}
{% block mainbody %}
<p>extends base</p>
{% endblock %}
模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks 。
加载器
模板加载器负责定位模板,加载它们,并返回模板对象.
Django提供几个内置的模板加载器并且支持自定义的模板加载器.
上下文处理器
Context处理器是这样的函数:接收当前的 HttpRequest 作为参数,并返回一个 字典,该字典中包含了将要添加到渲染的context中的数据。
它们的主要用途是添加所有的模板context共享的公共数据,而不需要在每个视图中重复代码。
Django提供了很多 内置的context处理器 . 实现自定义context处理器很简单,只要定义一个函数。