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="