导图社区 Jinja2模版语法
这是一篇关于Jinja2模版语法的思维导图,主要内容包括:1. 变量输出,2. 控制结构,3. 注释,4. 过滤器(Filters),5. 测试(Tests),6. 宏(Macros),7. 模板继承,8. 空白控制,9. 其他功能,总结。
编辑于2025-05-18 16:04:50Jinja2模版语法
以下是 Jinja2 模板语言的核心语法总结及示例:
1. 变量输出
语法:{{ variable }} 用途:渲染变量的值。 示例:
Hello, {{ user.name }}! <!-- 若 user.name = "Alice" → 输出 "Hello, Alice!" -->
2. 控制结构
语法:{% ... %} 用途:实现逻辑控制(条件、循环等)。
条件语句(if):
{% if user.is_admin %} <p>Welcome Admin!</p> {% elif user.is_member %} <p>Welcome Member!</p> {% else %} <p>Access Denied.</p> {% endif %}
循环语句(for):
<ul> {% for item in items %} <li>{{ item.name }}</li> {% else %} <li>No items found.</li> {% endfor %} </ul>
3. 注释
语法:{# ... #} 用途:添加不会被渲染的注释。 示例:
{# 这是注释,不会输出 #}
4. 过滤器(Filters)
语法:{{ variable | filter }} 用途:对变量进行格式化或处理(支持链式调用)。 示例:
{{ text | upper }} <!-- 转为大写 --> {{ list | join(", ") }} <!-- 列表拼接为字符串 --> {{ value | default("N/A") }} <!-- 默认值 -->
Jinja2 提供了丰富的内置过滤器来处理变量数据,以下是常用的过滤器分类及示例(基于 Jinja2 3.x 版本):
常用过滤器分类及示例
字符串处理
过滤器 示例 说明 lower {{ "HELLO" | lower }} → hello 转小写 upper {{ "hello" | upper }} → HELLO 转大写 capitalize {{ "hello" | capitalize }} → Hello 首字母大写 title {{ "hello world" | title }} → Hello World 每个单词首字母大写 trim {{ " text " | trim }} → text 去除首尾空格 replace {{ "Hi" | replace("Hi", "Hello") }} → Hello 字符串替换 striptags {{ "<b>text</b>" | striptags }} → text 去除 HTML 标签
列表与集合操作
过滤器 示例 说明 join {{ ["A", "B"] | join(";") }} → A;B 列表连接为字符串 length {{ [1,2,3] | length }} → 3 获取列表/字符串长度 first {{ [1,2,3] | first }} → 1 获取第一个元素 last {{ [1,2,3] | last }} → 3 获取最后一个元素 sort {{ [3,1,2] | sort }} → [1,2,3] 排序列表 unique {{ [1,2,2,3] | unique }} → [1,2,3] 去重 map {{ users | map(attribute="name") }} 提取对象属性组成新列表
数值处理
过滤器 示例 说明 round {{ 3.1415 | round(2) }} → 3.14 四舍五入到指定位数 abs {{ -5 | abs }} → 5 绝对值 int {{ "123" | int }} → 123 转换为整数 float {{ "123.45" | float }} → 123.45 转换为浮点数
逻辑与类型检查
过滤器 示例 说明 default {{ undefined_var | default("N/A") }} → N/A 设置默认值 default (布尔短路) {{ false | default(true) }} → false 仅当变量未定义时生效 select {{ ["a","b","c"] | select("equalto", "b") }} → ["b"] 根据条件筛选列表元素 reject {{ [1,2,3] | reject("even") }} → [1,3] 排除符合条件的元素 filesizeformat {{ 1024 | filesizeformat }} → 1 KB 文件大小友好格式
转义与安全
过滤器 示例 说明 escape {{ "<html>" | escape }} → <html> HTML 转义(别名 e) safe {{ "<span>" | safe }} 标记内容为安全 HTML tojson {{ data | tojson }} 将对象转为 JSON 字符串
日期时间处理
过滤器 示例 说明 datetimeformat {{ date_obj | datetimeformat("%Y-%m-%d") }} 格式化日期时间
链式调用示例
{{ text | default("No text") | upper | trim }} <!-- 如果 text 未定义 → 输出 "NO TEXT" -->
自定义过滤器
除了内置过滤器,Jinja2 允许通过 Python 代码扩展自定义过滤器:
# Python 代码注册自定义过滤器 def reverse_filter(s): return s[::-1] env = Environment() env.filters['reverse'] = reverse_filter
模板中使用:
{{ "hello" | reverse }} → "olleh"
完整列表
Jinja2 官方文档列出了所有内置过滤器,具体可参考:
关键点:
内置过滤器覆盖大多数常见数据处理场景。
过滤器可以组合使用(从左到右执行)。
通过 default 和 escape 提升模板鲁棒性和安全性。
5. 测试(Tests)
语法:{% if ... is ... %} 用途:检查变量是否满足条件。 示例:
{% if user.age is even %} Age is even. {% endif %} {% if var is defined %} Var exists. {% endif %}
6. 宏(Macros)
语法:{% macro ... %} ... {% endmacro %} 用途:定义可复用的代码块(类似函数)。 示例:
{% macro input(name, type='text') %} <input type="{{ type }}" name="{{ name }}"> {% endmacro %} {{ input('username') }} <!-- 调用宏 --> {{ input('password', type='password') }}
7. 模板继承
语法:{% extends ... %} 和 {% block ... %} 用途:继承父模板并覆盖部分内容。
父模板 (base.html):
<html> <head> <title>{% block title %}Default Title{% endblock %}</title> </head> <body> {% block content %}{% endblock %} </body> </html>
子模板 (child.html):
{% extends "base.html" %} {% block title %}My Page{% endblock %} {% block content %} <h1>Hello Jinja2!</h1> {% endblock %}
8. 空白控制
语法:在 {% ... %} 或 {{ ... }} 后添加 - 用途:去除不必要的空白符号。 示例:
{% for num in [1,2,3] -%} <!-- 左减号去前导空白 --> {{ num }} {%- endfor %} <!-- 右减号去尾部空白 --> <!-- 输出 "123"(无换行) -->
9. 其他功能
赋值变量:
{% set greeting = "Hello World" %} {{ greeting }}
包含其他模板:
{% include 'header.html' %}
循环变量(loop):
{% for user in users %} {{ loop.index }}. {{ user.name }} <!-- 输出序号(从1开始) --> {% endfor %}
总结
Jinja2 通过简洁的语法({{ }}、{% %}、{# #})实现了动态模板渲染,涵盖变量输出、逻辑控制、模板继承等核心功能。结合过滤器和宏可以极大提升代码复用性,而模板继承则是组织复杂项目的关键工具。