Django Paginator分页器底部页码按钮未正常显示问题排查
问题定位
分页页码无法渲染的核心原因是视图函数未将paginator实例传入模板上下文:
- 你在视图中调用
render时,仅向模板传递了当前分页的Page对象(即你命名为list的变量),没有传递Paginator类的实例 - 模板中
{% for page in paginator.page_range %}循环执行时,找不到paginator这个变量,循环直接终止,因此不会渲染任何页码按钮
修复方法
1. 修改视图传参
在视图的render上下文参数中补充paginator实例即可,修改最后一行返回代码:
# 原代码 # return render(request, 'projects/projects.html',{'list': obj}) # 修改后 return render(request, 'projects/projects.html',{ 'list': obj, 'paginator': paginator })
补充说明:Django的
Page对象本身自带paginator属性指向关联的分页器实例,如果你不想额外传参,也可以直接把模板里的循环条件改成{% for page in list.paginator.page_range %},但显式传递paginator的代码可读性更高,更推荐使用。
2. 可选功能补全(避坑优化)
你当前模板里的上一页、下一页按钮写死了href="#",没有实际跳转逻辑,可以结合Page对象自带的方法补全完整分页交互,参考代码如下:
<div class="pagination"> <ul class="container"> <!-- 上一页按钮 --> {% if list.has_previous %} <li><a href="?page={{ list.previous_page_number }}" class="btn">❮ Prev</a></li> {% else %} <li><a href="#" class="btn btn--disabled">❮ Prev</a></li> {% endif %} <!-- 页码按钮 --> {% for page_num in paginator.page_range %} <li> <a href="?page={{page_num}}" class="btn btn--sub{% if page_num == list.number %} btn--active{% endif %}">{{ page_num }}</a> </li> {% endfor %} <!-- 下一页按钮 --> {% if list.has_next %} <li><a href="?page={{ list.next_page_number }}" class="btn">Next ❯</a></li> {% else %} <li><a href="#" class="btn btn--disabled">Next ❯</a></li> {% endif %} </ul> </div>
内容的提问来源于stack exchange,提问作者Fahad Waseem
相关产品推荐
相关产品推荐

