page_range()
函数是 Django 分页器(Paginator)提供的一个方法,它可以返回一个用户自定义范围内的页码列表。
下面是 page_range()
的方法定义:
def page_range(self, window=2):
"""
Return a 1-based range of pages for iterating through within
a template for loop.
"""
#...省略部分代码...
该方法接收一个可选参数 window
,默认值为 2,该参数表示当前页码前后要显示几个页码。例如如果当前页码为 5,window
为 2,则最终将返回一个包含 5-2 到 5+2 的页码列表,即 [3, 4, 5, 6, 7]。
下面演示 page_range()
的基本使用方法:
from django.core.paginator import Paginator
# 假设我们有一个列表
data_list = list(range(50))
# 每页显示20条
paginator = Paginator(data_list, 20)
# 获取第2页数据
page_obj = paginator.get_page(2)
# 生成1到10页的页码列表
page_range = page_obj.paginator.page_range(5)
print(list(page_range)) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
以上代码首先创建了一个包含50个元素的列表 data_list
,我们将其分页,每页20个元素。然后获取第2页的数据,该页数据对应的 Page
对象保存在 page_obj
变量中。接着使用 page_obj.paginator.page_range()
方法生成当前页码前后5个页码的列表,最终结果为 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
。注意,由于当前页码为2,因此返回的列表中包含了前5个页码。
下面再通过两个实例演示使用 page_range()
的具体场景。
例1:在分页中显示页码列表
{% if page_obj.has_previous or page_obj.has_next %}
<div class="pagination">
<ul>
{% if page_obj.has_previous %}
<li><a href="?page={{ page_obj.previous_page_number }}">«</a></li>
{% else %}
<li class="disabled"><span>«</span></li>
{% endif %}
{% for num in page_obj.paginator.page_range %}
{% if num == page_obj.number %}
<li class="active"><span>{{ num }}</span></li>
{% else %}
<li><a href="?page={{ num }}">{{ num }}</a></li>
{% endif %}
{% endfor %}
{% if page_obj.has_next %}
<li><a href="?page={{ page_obj.next_page_number }}">»</a></li>
{% else %}
<li class="disabled"><span>»</span></li>
{% endif %}
</ul>
</div>
{% endif %}
该示例中使用了 page_range()
方法来生成当前页码前后的页码列表,并使用在模板中生成分页的页码链接。
例2:使用Ajax异步加载分页
$(".pagination a").click(function(event){
// 阻止a标签的默认行为
event.preventDefault();
// 获取href属性
var url = $(this).attr("href");
// 使用Ajax异步加载分页数据
$.get(url, function(data){
$(".data-list").html(data);
});
});
在这个示例中,我们使用了 jQuery 的 Ajax 方法来异步加载分页数据,在用户点击链接时,会向服务器发送一个 GET 请求来获取对应页码的分页数据,然后将数据展示在页面中。注意,这个示例并不是完整的代码,还需要服务端处理Ajax请求并返回相应的分页数据,但是我们不在这里详细介绍。