跳到主要内容

Jinja2 过滤器和测试器

前言

在 Python 中处理变量用函数,在 Jinja2 模板中则用过滤器和测试器:过滤器用于转换/格式化输出,测试器用于判断元素是否满足条件。

内置过滤器

{{ name | upper }}              {# 转大写 #}
{{ name | lower }} {# 转小写 #}
{{ name | title }} {# 首字母大写 #}
{{ price | round(2) }} {# 保留 2 位小数 #}
{{ price | int }} {# 转整型 #}
{{ items | length }} {# 长度 #}
{{ items | join(", ") }} {# 用分隔符拼接 #}
{{ items | first }} {# 第一个元素 #}
{{ items | last }} {# 最后一个元素 #}
{{ value | default("空") }} {# 默认值 #}
{{ text | truncate(20) }} {# 截断 #}
{{ text | safe }} {# 标记为安全,不转义(慎用,防 XSS) #}
{{ value | tojson }} {# 转 JSON #}

过滤器可以串联:

{{ name | trim | upper }}

自定义过滤器

@app.template_filter() 注册:

from flask import Flask

app = Flask(__name__)


@app.template_filter("format_currency")
def format_currency(value: float) -> str:
return f"¥{value:,.2f}"

模板中使用:

{{ price | format_currency }}

测试器

测试器用来判断值是否满足条件,语法为 is

{% if value is defined %}     {# 变量是否已定义 #}
{% if value is none %} {# 是否为 None #}
{% if value is string %} {# 是否为字符串 #}
{% if value is number %} {# 是否为数字 #}
{% if value is mapping %} {# 是否为 dict #}
{% if value is sequence %} {# 是否为序列 #}
{% if value is iterable %} {# 是否可迭代 #}
{% if value is odd %} {# 是否奇数 #}
{% if value is even %} {# 是否偶数 #}
{% endif %}

带参数的使用方式:

{% if 5 is divisibleby 2 %} 不输出 {% else %} 5 不能被 2 整除 {% endif %}

自定义测试器

@app.template_test() 注册:

@app.template_test("adult")
def is_adult(age: int) -> bool:
return age >= 18

模板中使用:

{% if user.age is adult %}
<p>已成年</p>
{% endif %}

参考