当前位置: 首页 > ai >正文

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循环内置函数点我查看):

基本循环变量

  1. loop.index - 当前循环迭代的次数(从1开始)
  2. loop.index0 - 当前循环迭代的次数(从0开始)
  3. loop.revindex - 从循环末尾开始的迭代次数(到1结束)
  4. loop.revindex0 - 从循环末尾开始的迭代次数(到0结束)
  5. loop.first - 如果是第一次迭代则为True
  6. loop.last - 如果是最后一次迭代则为True
  7. loop.length - 序列中的项目数

循环深度相关变量(用于嵌套循环)

  1. loop.depth - 当前循环的嵌套深度(从1开始)
  2. loop.depth0 - 当前循环的嵌套深度(从0开始)

循环控制变量

  1. loop.cycle - 一个辅助函数,用于在序列项之间循环
  2. *loop.changed(args) - 如果传入的参数与上一次调用时不同则返回True

分组相关变量

  1. 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代码中。

http://www.xdnf.cn/news/792.html

相关文章:

  • VScode-py环境
  • 【JS】计算任意字符串的像素宽度(px)
  • VR、AR、互动科技:武汉数字展馆制作引领未来展览新体验
  • 单例模式(线程安全)
  • Docker Compose 使用实例
  • 【漫话机器学习系列】214.停用词(Stop Words)
  • 查看MAC 地址以及简单了解
  • CHAPTER 11 A Pythonic Object
  • 定期检查滚珠丝杆的频率是多久?
  • Rust: 从内存地址信息看内存布局
  • OpenCV 图形API(44)颜色空间转换-----将图像从 BGR 色彩空间转换为 RGB 色彩空间函数BGR2RGB()
  • XMC4800 芯片深度解读:架构、特性、应用与开发指南
  • OpenCV中的图像旋转方法详解
  • 特征选择与类不平衡处理
  • aws服务--S3介绍使用代码集成
  • Missashe考研日记-day23
  • 在Ubuntu下用Chrony做主从机时间同步
  • 栈和字符串,力扣.43.字符串相乘力扣1047.删除字符串中的所有相邻重复项力扣.844比较含退格的字符串力扣227.基本计算器II
  • 《马尼拉》桌游期望计算器
  • Ubuntu下展锐刷机工具spd_dump使用说明
  • Python3网络爬虫开发--爬虫基础
  • Java 设计模式心法之第4篇 - 单例 (Singleton) 的正确打开方式与避坑指南
  • 每天学一个 Linux 命令(30):cut
  • 【React】搜索时高亮被搜索选中的文案
  • 大数据系列 | 详解基于Zookeeper或ClickHouse Keeper的ClickHouse集群部署--完结
  • TensorFlow和PyTorch学习原理解析
  • 掌握常见 HTTP 方法:GET、POST、PUT 到 CONNECT 全面梳理
  • FreeRTos学习记录--2.内存管理
  • 华为云获取IAM用户Token的方式及适用分析
  • 潞晨科技将暂停DeepSeek API服务,AI大模型技术红利普惠化与市场竞争白热化叠加,内卷恶果,开始显现!