You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jinja模板中如何使用max/min过滤器计算分页页码区间

Jinja模板分页页码渲染问题修复

问题说明

开发列表分页功能时,需要渲染当前页前后各2页的页码,需过滤0、负数、超过总页数的无效页码。最初直接在Jinja模板的range()函数中调用Python内置max/min函数计算页码范围的写法无法运行,因为Jinja默认上下文未注册这两个内置函数,虽然Jinja自带对应max/min过滤器,但不清楚如何在range()传参场景下使用。

初始错误代码如下:

{% for p in range(max(1, list.cur_page - 2), min(list.cur_page + 2, list.pages)) %}
<li class="page-item"><a class="page-link" href="{{ list.url }}/{{ p }}">{{ p }}</a></li>   
{% endfor %}

修复方案

Jinja的max/min是过滤器,需要通过管道符|调用,作用对象是可迭代序列——也就是说要比较多个值的大小,先把所有待比较值放到列表里,再接过滤器就能返回最大/最小值。
另外注意Python(包括Jinja)里的range()是左闭右开区间,生成的序列不包含结束位置的参数,原写法会漏掉结束位置的页码,需要给计算出的结束页码加1才能正确取到值。

推荐写法(可读性最佳)

先通过set标签提前计算合法的起止页码,再传入range()循环,逻辑清晰不容易出错:

{# 计算起始页码:当前页-2 和 1 取最大值,避免出现小于1的无效页码 #}
{% set page_start = [list.cur_page - 2, 1] | max %}
{# 计算结束页码:当前页+2 和 总页数 取最小值,避免出现超过总页数的无效页码 #}
{% set page_end = [list.cur_page + 2, list.pages] | min %}

{% for p in range(page_start, page_end + 1) %}
<li class="page-item">
    <a class="page-link" href="{{ list.url }}/{{ p }}">{{ p }}</a>
</li>
{% endfor %}

简写写法(无需单独赋值)

如果不想单独定义变量,也可以把过滤器逻辑直接写在range()的参数位置,只是可读性稍差:

{% for p in range( [list.cur_page - 2, 1]|max, [list.cur_page + 2, list.pages]|min + 1 ) %}
<li class="page-item">
    <a class="page-link" href="{{ list.url }}/{{ p }}">{{ p }}</a>
</li>
{% endfor %}

效果校验

不同场景下的渲染结果符合预期:

  • 总页数10、当前页为1:计算得起始页1,结束页3,渲染页码1、2、3,无0或负数
  • 总页数10、当前页为5:计算得起始页3,结束页7,渲染页码3、4、5、6、7,正好覆盖当前页前后各2页
  • 总页数10、当前页为9:计算得起始页7,结束页10,渲染页码7、8、9、10,无超过总页数的无效值

内容的提问来源于stack exchange,提问作者Ahmad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 02:39:31