Django4.0 模板-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 %}
标签提供多行注释。
组件
引擎
django.template.Engine
封装了 Django 模板系统的实例。直接实例化 Engine
的主要原因是为了在 Django 项目之外使用 Django 模板语言。
django.template.backends.django.DjangoTemplates
是一个简单封装,使 django.template.Engine
适应 Django 的模板后端API。
模板
django.template.Template
代表已编译的模板。模板可以通过 Engine.get_template()
或 Engine.from_string()
获得。
同样 django.template.backends.django.Template
是一个简单封装,使 django.template.Template
适应通用模板 API。
上下文
django.template.Context
除了上下文数据外,还保存了一些元数据。它被传递给 Template.render()
来渲染模板。
django.template.RequestContext
是 Context
的子类,它储存当前的 HttpRequest
并运行模板上下文处理器。
通用 API 没有对应的概念。上下文数据以普通的 dict
传递,而当前的 HttpRequest
则根据需要单独传递。
加载器
模板加载器负责定位模板,加载模板,并返回 Template
对象。
Django 提供了几个 内建模板加载器 并且支持 自定义模板加载器。
上下文处理器
上下文处理器是接收当前的 HttpRequest
作为参数,并返回一个 dict
的数据添加到渲染上下文的函数。
它们的主要用途是将所有模板共享的通用数据添加到上下文中,而无需在每个视图中重复代码。
Django 提供了许多 内置上下文处理器,你也可以实现自己的其他上下文处理器。