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

  • Post category:Python

page_range()函数是 Django 分页器 Paginator 中的一个方法,用于获取当前页面周围的一定数量的页面范围。

该函数可以接受一个参数 num_pages,表示总共的页面数,以及一个参数 current_page,表示当前的页码。默认情况下,该函数得到当前页码前后两个数字,但如果页面太靠近开头或结尾,则无法得到两个页码。在这种情况下,该函数只返回 nearby_pages 个页码。

该函数的用法如下所示:

def page_range(num_pages, current_page, nearby_pages=2):
    if num_pages <= (nearby_pages*2 + 1):
        return range(1, num_pages+1)
    elif current_page <= nearby_pages+1 or num_pages-current_page <= nearby_pages:
        return range(1, nearby_pages*2+2)
    else:
        return range(current_page-nearby_pages, current_page+nearby_pages+1)

例如,我们在一个博客网站中使用了分页器,每页显示10篇文章,总共有100篇文章。当用户浏览第6页时,需要展示当前页面周围的5个页面范围,即2到8页。此时,可以通过以下方式获取页面范围:

from django.core.paginator import Paginator
from django.shortcuts import render

def blog_list(request):
    blog_list = Blog.objects.all()
    paginator = Paginator(blog_list, 10)
    current_page = request.GET.get('page', 1)  # 获取当前页码
    page_range = paginator.page_range(current_page=current_page)  # 获取页面范围
    page = paginator.get_page(current_page)
    context = {
        'page': page,
        'page_range': page_range,
    }
    return render(request, 'blog_list.html', context)

又例如,我们在一个电商网站中使用了分页器,每页显示20个商品,总共有200个商品。当用户浏览第15页时,需要展示当前页面周围的3个页面范围,即12到18页。此时,可以通过以下方式获取页面范围:

from django.core.paginator import Paginator

def product_list(request):
    product_list = Product.objects.all()
    paginator = Paginator(product_list, 20)
    current_page = request.GET.get('page', 1)  # 获取当前页码
    page_range = paginator.page_range(current_page=current_page, nearby_pages=3)  # 获取页面范围
    page = paginator.get_page(current_page)
    context = {
        'page': page,
        'page_range': page_range,
    }
    return render(request, 'product_list.html', context)

无论是博客列表页面还是商品列表页面,通过获取当前页面周围的页面范围,用户都可以更加方便地进行页面切换,提高了网站的用户体验。