详解Django的 page_range() 函数:获取页码范围

  • Post category:Python

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 }}">&laquo;</a></li>
    {% else %}
    <li class="disabled"><span>&laquo;</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 }}">&raquo;</a></li>
    {% else %}
    <li class="disabled"><span>&raquo;</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请求并返回相应的分页数据,但是我们不在这里详细介绍。