如何在Django CBV ListView中使用Paginator的get_elided_page_range方法
问题根因
你调用get_elided_page_range方法时没有传入必选的当前页码参数,也没有配置页码展示规则参数,导致方法使用默认配置,只渲染首尾固定数量的页码,不会展示当前页前后的页码。
解决方法
只需修改模板中调用分页方法的代码,传入必要参数即可:
- 第一个参数填当前页码
page_obj.number,这是get_elided_page_range的必传参数 - 可通过两个可选参数自定义展示规则:
on_each_side:当前页码左右各展示多少个连续页码,默认值为2on_ends:分页首尾两端各展示多少个固定页码,默认值为2
修改后的模板代码
{% for i in paginator.get_elided_page_range(page_obj.number, on_each_side=2, on_ends=2) %} {% if page_obj.number == i %} <li class="active page-item"> <span class="page-link">{{ i }}</span> </li> {% else %} {% if i == paginator.ELLIPSIS %} <li class="page-item"> <span class="page-link">{{ paginator.ELLIPSIS }}</span> </li> {% else %} <li class="page-item"> <a class="page-link" href="?page={{ i }}">{{ i }}</a> </li> {% endif %} {% endif %} {% endfor %}
效果验证
按上述配置后,总81页、当前为第10页时,渲染出的分页范围为:1 2 ... 8 9 10 11 12 ... 80 81,符合预期展示效果。你可以根据业务需要调整on_each_side和on_ends的数值,修改前后和两端展示的页码数量。
注意该方法仅在Django 3.2及以上版本可用,版本低于要求的话需要先升级Django版本。
内容的提问来源于stack exchange,提问作者Vadim Beglov
相关产品推荐
相关产品推荐

