如何在Django模板中编写For循环实现分页页码输出?
Django分页:输出1到总页数的页码列表
嘿,我懂你想要实现的效果——把1到总页数(这里是9)的页码逐个列出来对吧?你当前的代码行不通,是因为paginated_queryset.num_pages是一个整数,而Django模板里的for循环只能遍历可迭代对象(比如列表、range序列这类),直接循环整数肯定出不来结果的。
给你几个简单易懂的解决方案,适合新手操作:
方法一:在视图里生成页码范围(最推荐)
这是最直观的方式,在视图层处理好页码范围,再传给模板渲染:
视图代码:
from django.core.paginator import Paginator from django.shortcuts import render from .models import YourModel # 替换成你的模型 def your_page_view(request): # 获取你的数据集 queryset = YourModel.objects.all() # 初始化分页器,这里设置每页10条数据,可根据需求调整 paginator = Paginator(queryset, per_page=10) # 获取当前请求的页码 page_number = request.GET.get('page') # 获取分页后的对象 paginated_queryset = paginator.get_page(page_number) # 生成1到总页数的整数范围(注意要+1,因为range是左闭右开的) page_range = range(1, paginator.num_pages + 1) # 把分页对象和页码范围一起传给模板 return render(request, 'your_template.html', { 'paginated_queryset': paginated_queryset, 'page_range': page_range })
模板代码:
在模板里直接循环page_range就可以了:
{% for i in page_range %} {{ i }} {% endfor %}
这样就能输出你想要的1 2 3 4 5 6 7 8 9啦。
方法二:自定义模板过滤器(无需修改视图)
如果不想改动视图代码,可以写一个简单的模板过滤器,让模板能把整数转换成页码范围:
第一步:创建过滤器文件
在你的Django应用下新建templatetags目录(如果没有的话),然后在里面创建pagination_tags.py文件,内容如下:
from django import template register = template.Library() @register.filter def to_page_range(num_pages): # 把整数转换成1到num_pages的范围 return range(1, num_pages + 1)
第二步:在模板里使用过滤器
先加载过滤器,再用它处理num_pages:
{% load pagination_tags %} {% for i in paginated_queryset.num_pages|to_page_range %} {{ i }} {% endfor %}
方法三:用模板内置标签绕一下(不推荐,可读性差)
如果临时想快速实现,也可以用模板的rjust标签生成对应长度的字符串,再通过循环计数器获取页码:
{% with total_pages=paginated_queryset.num_pages %} {% for _ in "x"|rjust:total_pages %} {{ forloop.counter }} {% endfor %} {% endwith %}
这种方法虽然能工作,但代码可读性差,新手不建议长期用。
作为Django新手,遇到这种“概念理解偏差”的问题很正常,多试几次就熟悉啦~
内容的提问来源于stack exchange,提问作者Shatish Desai
相关产品推荐
相关产品推荐

