在 Jinja2 中,过滤器是用于对模板变量进行操作的工具,类似于管道。以下是 Jinja2 中常用的过滤器及其功能:
1. 字符串处理
capitalize
将字符串的首字母大写,其余部分小写。
{{ "hello world" | capitalize }}
<!-- 输出: Hello world -->
lower
将字符串转为小写。
{{ "HELLO" | lower }}
<!-- 输出: hello -->
upper
将字符串转为大写。
{{ "hello" | upper }}
<!-- 输出: HELLO -->
title
将字符串中每个单词的首字母大写。
{{ "hello world" | title }}
<!-- 输出: Hello World -->
trim
去掉字符串两端的空格。
{{ " hello " | trim }}
<!-- 输出: hello -->
replace
替换字符串中的子串。
{{ "hello world" | replace("world", "Jinja2") }}
<!-- 输出: hello Jinja2 -->
2. 列表处理
length
返回列表、字符串或字典的长度。
{{ [1, 2, 3, 4] | length }}
<!-- 输出: 4 -->
join
将列表中的元素用指定字符串连接为一个字符串。
{{ ["Python", "Flask", "Jinja2"] | join(", ") }}
<!-- 输出: Python, Flask, Jinja2 -->
sort
对列表进行排序(默认为升序)。
{{ [3, 1, 4, 2] | sort }}
<!-- 输出: [1, 2, 3, 4] -->
unique
移除列表中的重复元素。
{{ [1, 2, 2, 3, 4, 4] | unique }}
<!-- 输出: [1, 2, 3, 4] -->
reverse
将列表或字符串反转。
{{ [1, 2, 3] | reverse }}
<!-- 输出: [3, 2, 1] -->
{{ "hello" | reverse }}
<!-- 输出: olleh -->
3. 数值处理
abs
返回绝对值。
{{ -5 | abs }}
<!-- 输出: 5 -->
round
对数值进行四舍五入。
{{ 3.14159 | round(2) }}
<!-- 输出: 3.14 -->
sum
对列表或字典的值求和。
{{ [1, 2, 3, 4] | sum }}
<!-- 输出: 10 -->
4. 字典处理
keys
返回字典中的键。
{{ {"a": 1, "b": 2} | keys }}
<!-- 输出: ["a", "b"] -->
values
返回字典中的值。
{{ {"a": 1, "b": 2} | values }}
<!-- 输出: [1, 2] -->
5. 默认值处理
default
如果变量未定义或为 None
,使用默认值。
{{ user | default("Guest") }}
<!-- 如果 user 未定义,则输出: Guest -->
6. 测试和逻辑处理
defined
检查变量是否已定义。
{{ user is defined }}
<!-- 如果 user 定义了,则输出: True -->
equalto
检查变量是否等于某个值。
{{ score is equalto 100 }}
<!-- 如果 score 等于 100,则输出: True -->
7. 日期和时间
strftime
格式化日期。
{{ date | strftime("%Y-%m-%d") }}
<!-- 输出: 2025-01-15 -->
8. 安全处理
escape
转义 HTML 字符。
{{ "<div>Hello</div>" | escape }}
<!-- 输出: <div>Hello</div> -->
safe
标记字符串为安全,不再转义。
{{ "<b>Hello</b>" | safe }}
<!-- 输出: <b>Hello</b> -->
示例综合应用
假设后端传入的数据为:
data = {"name": "john doe","tags": ["Python", "Flask", "Jinja2"],"scores": [10, 20, 30],"description": "<p>This is a <b>description</b></p>"
}
模板代码:
<p>Name: {{ data.name | title }}</p>
<p>Tags: {{ data.tags | join(", ") }}</p>
<p>Highest Score: {{ data.scores | max }}</p>
<p>Description: {{ data.description | escape }}</p>
渲染结果:
<p>Name: John Doe</p>
<p>Tags: Python, Flask, Jinja2</p>
<p>Highest Score: 30</p>
<p>Description: <p>This is a <b>description</b></p></p>
这些过滤器大大提高了 Jinja2 的灵活性,结合模板变量和逻辑,可以生成强大的动态内容。