Django使用pagination的num_pages属性无法获取总页数问题排查
Django分页
num_pages属性无法获取总页数的解决方法 核心错误原因
90%以上的该问题都是属性调用对象搞错:num_pages是DjangoPaginator分页器实例的内置属性,不是单页Page对象的属性,直接在Page对象上调用该属性自然无法拿到值。
其余常见诱因包括分页器实例化顺序错误、模板上下文传参缺失、传入分页器的数据集非法三类。
正确写法示例
视图层代码
from django.core.paginator import Paginator from django.shortcuts import render from .models import Post # 替换为你自己的业务模型 def post_list(request): # 1. 拿到全量待分页数据,不要提前做切片操作 post_list = Post.objects.all().order_by('-create_time') # 2. 实例化分页器,传入数据集和单页展示条数 paginator = Paginator(post_list, per_page=15) # 3. 获取前端传递的当前页码 page_num = request.GET.get('page', 1) # 4. 获取当前页对应的Page对象 page_obj = paginator.get_page(page_num) # 正确取总页数的方式:从Paginator实例上调用属性 total_page_count = paginator.num_pages # 传值给模板时,需要把paginator实例或者提前取好的总页数传入上下文 return render(request, 'post_list.html', { 'page_obj': page_obj, 'paginator': paginator, 'total_page_count': total_page_count })
模板层代码
<!-- 正确写法1:通过传入的paginator实例取总页数 --> <p>总页数:{{ paginator.num_pages }}</p> <!-- 正确写法2:通过单独传入的总页数变量取值 --> <p>总页数:{{ total_page_count }}</p> <!-- 错误写法示例:Page对象没有num_pages属性,该写法无效 --> <!-- <p>总页数:{{ page_obj.num_pages }}</p> -->
排查清单
按以下顺序核对代码即可快速定位问题:
- 核对属性调用主体:确认
num_pages是绑定在Paginator实例上调用,而非Page实例上 - 核对实例化顺序:必须先完成Paginator实例的创建,再调用
num_pages属性,不要写反执行顺序 - 核对传入数据集:传给Paginator的第一个参数不能是None、提前切片的查询集、非可迭代对象
- 核对模板传参:模板中使用时,确认对应变量已经通过视图上下文传入,不要直接渲染未定义的
num_pages变量 - 核对组件类型:如果使用DRF分页、第三方分页插件,需核对对应组件的总页数属性命名,部分组件不会沿用原生Django的
num_pages属性名
内容的提问来源于stack exchange,提问作者KS Bhale
相关产品推荐
相关产品推荐

