模板
模板
作为一个Web框架,Django需要一种动态生成HTML的便捷方法。最常用的方法依赖于模板。模板包含所需HTML输出的静态部分以及描述动态内容将被插入的一些特殊语法。
一个 Django 项目可以配置一个或多个模板引擎(如果不使用模板,甚至为零)。Django 为其自己的模板系统(创造性地称为 Django 模板语言 (DTL))和流行的替代方案Jinja2提供了内置引擎。其他模板语言的引擎可以从第三方获得。
支持模板引擎
模板引擎使用该TEMPLATES
设置进行配置。这是一个配置列表,每个引擎一个。默认值为空。startproject
命令生成的settings.py
定义了一些有用的值:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
# ... some options here ...
},
},
]
BACKEND
是实现 Django 模板后端 API 的模板引擎类的虚拟 Python 路径。内置后端是django.template.backends.django.DjangoTemplates
和 django.template.backends.jinja2.Jinja2
。
由于大多数引擎从文件加载模板,因此每个引擎的顶级配置包含两个常见设置:
虽然不常见,但可以使用不同的选项配置同一后端的多个实例。在这种情况下,您应该为每个引擎定义一个唯一的 NAME
。
OPTIONS
包含引擎特定的设置。
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
一些过滤器接受一个参数:
{{ my_date|date:"Y-m-d" }}
注释
单行注释
注释看起来像这样:
{# this won't be rendered #}
多行注释
{% comment %}
和 {% endcomment %}
标签之间的内容将会被注释。
可以在第一个标记中插入一个可选注释。例如,在注释代码时, 说明禁用代码的原因时,非常有用。
<p>Rendered text with {{ pub_date|date:"c" }}</p>
{% comment "Optional note" %}
<p>Commented out text with {{ create_date|date:"c" }}</p>
{% endcomment %}
comment
标签不能嵌套。