Django 3.2智能分页get_elided_page_range方法初尝!

Django 3.2引入了get_elided_page_range方法,改善了分页体验。本文通过实例解析该方法的使用,展示如何在视图和模板中实现智能分页,减少大量页码显示,提升用户体验。
摘要由CSDN通过智能技术生成

Django 3.2版本本月正式发布了, 其中一个重要变化就是新增了智能分页get_elided_page_range方法。Django 3.2之前的Paginator类将连续输出所有页码,非常不智能。本文将演示如何使用get_elided_page_range方法实现智能分页。

get_elided_page_range方法解读

改方法接收3个参数,第一个参数number为当前页码数, on_each_side为当前页码左右两边的页数,on_ends为首尾页码范围。

Paginator.get_elided_page_range(number, on_each_side=3, on_ends=2)

如果当前页码为第10页,使用该方法将输出如下页码范围(page_range)。10左右两边各有3页,首尾各有2页,其余页码号码用...代替。将page_range这个变量传递到前端模板进行遍历即可实现智能分页。

[1, 2, '…', 7, 8, 9, 10, 11, 12, 13, '…', 49, 50]

Django 3.2之前版本非智能分页

我们有个House模型。为了模拟总页数非常多的情形,我们将每页记录数量设为1条。视图函数如下所示:

# Filter houses
def house_filter(request):
    qs = House.objects.all()
    paginator = Paginator(qs, 1) # 每页1条记录
    page = request.GET.get('page', 1) # 获取当前page页码,默认为1
    try:
        page_obj = paginator.page(page) # 分页
    except PageNotAnInteger:
        page_obj = paginator.page(1) 
    except EmptyPage:
        page_obj = paginator.page(paginator.num_pages)
    is_paginated = True if paginator.num_pages > 1 else False


    context = {'page_obj': page_obj, 'paginator': paginator,
               'is_paginated': is_paginated,}
    return render(request, 'house/house_index.html', context)


假如前端模板样式用bootstrap 4,对应分页的前端模板如下所示:

# house/house_index.html
{% block content %}
         <div class="table-responsive">
             <table class="table table-striped table-hover">
                 <thead>
                 <tr>
                     <th scope="col">描述</th>
                     <th scope="
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
`get_elided_page_range` 是 Django 分页器(Paginator)的一个方法,用于获取分页导航栏中的页码范围。它返回一个列表,其中包含了要在分页导航中显示的页码。 默认情况下,当页码非常多时,分页导航栏会显示一个省略号(...)来代表被省略的页码范围。`get_elided_page_range` 方法会根据当前页码和总页数,计算出合适的页码范围,以便在分页导航中显示。 以下是一个示例用法: ```python from django.core.paginator import Paginator paginator = Paginator(your_queryset, per_page=10) page_number = request.GET.get('page') page_obj = paginator.get_page(page_number) elided_page_range = page_obj.paginator.get_elided_page_range(number=page_obj.number, on_each_side=2) ``` 在上面的示例中,`your_queryset` 是你的查询集,`per_page` 是每页显示的对象数量。`page_number` 是从请求参数中获取的当前页码。然后,通过 `paginator.get_page(page_number)` 获取当前页的对象列表和分页信息。 最后,使用 `get_elided_page_range` 方法来获取分页导航栏中的页码范围。`number` 参数是当前页码,`on_each_side` 参数是在当前页码两侧显示的页码数量。 例如,如果当前页是第5页,总共有10页,且 `on_each_side=2`,则 `get_elided_page_range` 方法将返回 `[1, '...', 3, 4, 5, 6, '...', 10]`,这是分页导航栏中要显示的页码范围。 你可以在模板中使用 `elided_page_range` 来渲染分页导航栏,以显示正确的页码范围。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值