作为一个网络框架,Django 需要一种方便的方式来动态生成 HTML。最常见的方法是依靠模板。一个模板包含了所需 HTML 输出的静态部分,以及一些特殊的语法,描述了如何插入动态内容。关于使用模板创建 HTML 页面的实战例子,请看
教程 3
。
一个 Django 项目可以配置一个或多个模板引擎(如果你不使用模板,甚至可以不配置模板)。Django 内置了自己的模板系统后端,创造性地称为 Django 模板语言(DTL),以及流行的替代版本
Jinja2
。其他模板语言的后端可以从第三方获得。你也可以编写自己的自定义后端,参见:
自定义模板后端
Django 定义了一个标准的API,用于加载和渲染模板,而不考虑后端。加载包括为给定的标识符找到模板并对其进行预处理,通常是将其编译成内存中的表示形式。渲染是指将上下文数据插入模板,并返回结果字符串。
Django 模板语言
是 Django 自己的模板系统。在 Django 1.8 之前,它是唯一的内置选项。它是一个很好的模板库,尽管它是相当有主见的,并且有一些特殊的地方。如果你没有迫切的理由选择另一个后端,你应该使用 DTL,特别是当你正在编写一个可插拔的应用程序,并且你打算发布模板时。Django 的 contrib 应用如果包含模板,比如
django.contrib.admin
,就使用 DTL。
由于历史原因,模板引擎的通用支持和 Django 模板语言的实现都在
django.template
的命名空间中。
模板系统对于不受信任的模板作者并不安全。例如,一个网站不应该允许其用户提供自己的模板,因为模板作者可以做一些事情,如执行 XSS 攻击和访问可能包含敏感信息的模板变量的属性。
Django 模板语言
这是对 Django 模板语言语法的概述。详细信息请参见
语言语法参考
。
Django 模板是使用 Django 模板语言标记的一个文本文档或Python字符串。模板引擎可以识别和解释一些构造。主要是变量和标签。
模板是通过上下文来渲染的。渲染用变量的值替换变量,变量的值在上下文中查找,并执行标签。其他的一切都按原样输出。
Django 模板语言的语法涉及四个构造。
变量从上下文中输出一个值,上下文是一个类似于字典的对象,将键映射到值。
变量被包围在
{{
和
}}
中,就像这样:
My first name is {{ first_name }}. My last name is {{ last_name }}.
使用上下文 {'first_name': 'John', 'last_name': 'Doe'}
,这个模板渲染为:
My first name is John. My last name is Doe.
字典查找、属性查找和列表索引查找都使用点表示法实现:
{{ my_dict.key }}
{{ my_object.attribute }}
{{ my_list.0 }}
如果变量解析为可调用对象,则模板系统将不带任何参数的情况下调用它,并使用其结果代替可调用对象。
标签在渲染过程中提供了任意逻辑。
这个定义是故意含糊的。例如,标签可以输出内容,或用作控制结构如 “if” 语句和 “for” 循环,或从数据库中抓取内容,甚至可以访问其他模板标签。
标签被包围在 {%
和 %}
中,就像这样:
{% csrf_token %}
大多数标签接受参数:
{% cycle 'odd' 'even' %}
一些标签需要开始和结束标签:
{% if user.is_authenticated %}Hello, {{ user.username }}.{% endif %}
提供 内置标签参考 以及 自定义标签编写指南。
过滤器
过滤器转换变量和标签参数的值。
它们看起来像这样:
{{ django|title }}
使用上下文 {'django': 'the web framework for perfectionists with deadlines'}
,这个模板渲染为:
The Web Framework For Perfectionists With Deadlines
一些过滤器接受一个参数: