Jinja2 内置变量和函数详解
更详细的英文文档介绍,点我查看
一、内置变量
1. range([start], stop[, step])
生成一个数字序列,类似于Python的range函数。
{% for i in range(5) %}{{ i }}, {# 输出: 0, 1, 2, 3, 4, #}
{% endfor %}{% for i in range(2, 6) %}{{ i }}, {# 输出: 2, 3, 4, 5, #}
{% endfor %}{% for i in range(0, 10, 2) %}{{ i }}, {# 输出: 0, 2, 4, 6, 8, #}
{% endfor %}
2. cycler(*items)
循环遍历一组值,常用于交替样式。
{% set row_class = cycler('odd', 'even') %}
{% for item in items %}<div class="{{ row_class.next() }}">{{ item }}</div>{# 输出交替的odd和even类 #}
{% endfor %}{# 也可以直接访问当前值 #}
{{ row_class.current }} {# 返回当前值 #}
3. joiner(sep=', ')
在循环中智能插入分隔符,不会在第一次迭代时插入。
{% set comma = joiner(", ") %}
{% for tag in tags %}{{ comma() }}{{ tag }}
{% endfor %}
{# 对于tags=['a','b','c'],输出: a, b, c #}
4. namespace()
创建一个新的命名空间对象,用于在循环中存储变量。
{% set ns = namespace(count=0) %}
{% for item in items %}{% set ns.count = ns.count + 1 %}Item {{ ns.count }}: {{ item }}
{% endfor %}
二、内置全局函数
1. dict(**items)
创建字典的便捷方式。
{{ dict(name='John', age=30) }}
{# 等同于 {'name': 'John', 'age': 30} #}{% set user = dict(name='Alice', role='admin') %}
{{ user.name }} {# 输出: Alice #}
2. len(obj)
获取对象的长度。
{{ "hello"|length }} {# 5 #}
{{ [1,2,3]|length }} {# 3 #}
{{ len([1,2,3,4]) }} {# 4 #}
3. max()
和 min()
获取序列的最大值/最小值。
{{ max([1, 2, 3]) }} {# 3 #}
{{ min([5, 2, 8]) }} {# 2 #}
4. sum(iterable, attribute=None, start=0)
计算序列的和。
{{ sum([1, 2, 3]) }} {# 6 #}
{{ sum([1, 2, 3], start=10) }} {# 16 #}{% set users = [{'score': 5}, {'score': 8}] %}
{{ sum(users, attribute='score') }} {# 13 #}
5. random(seq)
从序列中随机选择一个元素。
{{ random(['apple', 'banana', 'cherry']) }} {# 随机输出一个水果 #}
6. round(value, precision=0, method='common')
四舍五入数字。
{{ round(3.14159) }} {# 3 #}
{{ round(3.14159, 2) }} {# 3.14 #}
{{ round(3.5, 0, 'floor') }} {# 3.0 #}
三、内置测试函数
1. defined(value)
检查变量是否已定义。
{% if user is defined %}{{ user.name }}
{% else %}User is not defined
{% endif %}
2. divisibleby(value, num)
检查是否可被某数整除。
{{ 10 is divisibleby 5 }} {# True #}
{{ 10 is divisibleby 3 }} {# False #}{% if loop.index is divisibleby 3 %}{# 每3次循环执行 #}
{% endif %}
3. eq(a, b)
/ equalto(a, b)
检查是否相等。
{% if user.role is equalto 'admin' %}Show admin controls
{% endif %}
4. even(value)
和 odd(value)
检查偶数/奇数。
{{ 4 is even }} {# True #}
{{ 5 is odd }} {# True #}{% for i in range(10) %}{% if i is even %}Even{% else %}Odd{% endif %}
{% endfor %}
5. iterable(value)
检查是否可迭代。
{% if items is iterable %}{{ items|join(', ') }}
{% endif %}
6. none(value)
检查是否为None。
{% if result is none %}No results found
{% endif %}
7. sameas(value, other)
检查是否为同一对象。
{% if user is sameas current_user %}This is you!
{% endif %}
四、实用示例组合
分页导航示例
{% set pages = range(1, total_pages + 1) %}
{% set dotz = joiner("...") %}{% for p in pages %}{% if p == current_page %}<strong>{{ p }}</strong>{% elif p == 1 or p == total_pages or (p >= current_page-2 and p <= current_page+2) %}{{ dotz() }}<a href="?page={{ p }}">{{ p }}</a>{% endif %}
{% endfor %}
表格交替行样式
{% set row_style = cycler('bg-white', 'bg-gray-100') %}
<table>{% for item in items %}<tr class="{{ row_style.next() }}"><td>{{ item.name }}</td><td>{{ item.value }}</td></tr>{% endfor %}
</table>
智能显示标签
{% set comma = joiner(", ") %}
<div class="tags">{% for tag in article.tags %}{{ comma() }}<span class="tag">{{ tag }}</span>{% else %}<span class="no-tags">No tags</span>{% endfor %}
</div>
五、Jinja2 循环(loop)内置变量详解
在Jinja2模板引擎中,当使用for
循环时,会自动提供一个loop
变量,它包含了许多有用的属性来帮助你控制循环流程和获取循环状态信息。以下是所有可用的loop
内置变量(完成的for循环内置函数点我查看):
基本循环变量
- loop.index - 当前循环迭代的次数(从1开始)
- loop.index0 - 当前循环迭代的次数(从0开始)
- loop.revindex - 从循环末尾开始的迭代次数(到1结束)
- loop.revindex0 - 从循环末尾开始的迭代次数(到0结束)
- loop.first - 如果是第一次迭代则为
True
- loop.last - 如果是最后一次迭代则为
True
- loop.length - 序列中的项目数
循环深度相关变量(用于嵌套循环)
- loop.depth - 当前循环的嵌套深度(从1开始)
- loop.depth0 - 当前循环的嵌套深度(从0开始)
循环控制变量
- loop.cycle - 一个辅助函数,用于在序列项之间循环
- *loop.changed(args) - 如果传入的参数与上一次调用时不同则返回True
分组相关变量
- loop.groupby - 与
groupby
过滤器一起使用时,用于分组操作
示例用法
{% for item in items %}{{ loop.index }}. {{ item }} {% if loop.first %}(这是第一个项目){% endif %}{% if loop.last %}(这是最后一个项目){% endif %}{% if loop.index is divisibleby 2 %}(这是偶数行){% endif %}{# 使用cycle在两种颜色间切换 #}<div class="{{ loop.cycle('odd', 'even') }}">{{ item }}</div>
{% endfor %}
嵌套循环示例
{% for row in table %}{% for cell in row %}Cell {{ loop.index }} of row {{ loop.parent.index }}: {{ cell }}(嵌套深度: {{ loop.depth }}){% endfor %}
{% endfor %}
这些loop
变量在模板中非常有用,可以帮助你实现复杂的循环逻辑而无需在Python代码中预处理数据。
这些内置功能大大增强了Jinja2模板的表达能力,使得模板可以处理更复杂的逻辑而无需将所有处理都放在Python代码中。