文章目录
- 1.核心语法概览
- 2.语法能力详解
-
- [2.1 变量与属性访问](#2.1 变量与属性访问)
- [2.2 控制结构](#2.2 控制结构)
- 3.过滤器 (Filters)
- 4.模板复用
- 5.空白控制
- 6.快速上手示例
- 7.一句话总结
Jinja2 的模板语法可以看作是在静态文本(如 HTML)中,通过特定分隔符插入动态内容和逻辑,让模板最终能根据不同的输入数据渲染出不同的结果。
它的核心语法主要分为以下四类:
1.核心语法概览
| 语法 | 分隔符 | 作用 | 示例 |
|---|---|---|---|
| 变量输出 | {``{ ... }} |
计算并输出变量或表达式的值 | {``{ user.name }} 会显示用户的名字。 |
| 控制语句 | {% ... %} |
执行逻辑控制,如循环、条件判断、赋值等 | {% for item in items %} 用于循环遍历列表。 |
| 注释 | {# ... #} |
在模板中添加注释,渲染后不会出现在最终输出中 | {# 这是一段注释 #}。 |
| 行语句 | # ... ## |
一种简写方式,将一整行标记为语句,需在配置中开启 | 在配置允许的情况下,# for item in seq 等价于 {% for item in seq %}。 |
2.语法能力详解
2.1 变量与属性访问
输出变量很简单,比如 {``{ username }}。如果要访问变量的属性,既可以用点号 .,也可以用中括号 [],例如 {``{ foo.bar }} 和 {``{ foo['bar'] }} 是等效的。如果变量不存在,Jinja2 默认会将其视为空值或 undefined,具体行为取决于应用配置。
2.2 控制结构
Jinja2 支持丰富的逻辑控制,语法与 Python 非常相似。
- 条件判断 (
if):
jinja
{% if user.logged_in %}
欢迎回来,{{ user.name }}!
{% else %}
请先登录。
{% endif %}
- 循环 (
for):
jinja
<ul>
{% for item in items %}
<li>{{ loop.index }}. {{ item.name }}</li>
{% else %}
<li>列表为空</li>
{% endfor %}
</ul>
循环内可以访问 loop.index(当前迭代次数,从1开始)、loop.first(是否是第一个元素)等特殊变量。
3.过滤器 (Filters)
过滤器可以修改变量的输出,通过管道符 | 应用。例如:
{``{ name|upper }}:将name变量转为大写。{``{ "hello world"|title }}:将字符串转换为标题格式(每个单词首字母大写)。- 过滤器可以链式调用,如
{``{ name|striptags|title }}。
4.模板复用
Jinja2 提供了强大的模板复用机制。
- 模板继承 :通过
{% extends "base.html" %}可以继承一个基础模板,并使用{% block content %}来填充父模板中定义的可替换区块,避免大量重复的 HTML 结构。 - 包含 (
Include) :使用{% include 'header.html' %}可以将其他模板的内容嵌入到当前位置。
5.空白控制
默认情况下,模板中的空格和换行会被保留。但你可以通过在标签中添加减号 - 来手动控制:
{%- ... %}:移除标签前面的空白。{% ... -%}:移除标签后面的空白。- 例如,
{% for item in seq -%} {``{ item }} {%- endfor %}可以消除循环产生的多余空白,让输出更紧凑。
6.快速上手示例
假设你有一个用户数据 user = {"name": "Alice", "age": 30},和一个任务列表 tasks = ["写报告", "发邮件", "开会"]。
模板代码 (example.jinja2):
jinja
<!DOCTYPE html>
<html>
<head>
<title>用户看板</title>
</head>
<body>
<h1>你好,{{ user.name }}!</h1>
<p>你的年龄是 {{ user.age }} 岁。</p>
<h2>今日任务 (共 {{ tasks|length }} 项):</h2>
<ul>
{% for task in tasks %}
<li>{{ loop.index }}. {{ task }}</li>
{% endfor %}
</ul>
</body>
</html>
渲染结果:
html
<!DOCTYPE html>
<html>
<head>
<title>用户看板</title>
</head>
<body>
<h1>你好,Alice!</h1>
<p>你的年龄是 30 岁。</p>
<h2>今日任务 (共 3 项):</h2>
<ul>
<li>1. 写报告</li>
<li>2. 发邮件</li>
<li>3. 开会</li>
</ul>
</body>
</html>
7.一句话总结
Jinja2 = {``{ 变量 }} 输出内容 + {% 逻辑 %} 控制流程 + {# 注释 #} 说明 + 强大的过滤器和模板继承。核心思想是在静态模板中嵌入动态逻辑,让数据驱动页面生成。