Django已为开发者内置了分页功能,只需调用Django内置分页功能的函数即可实现数据分页功能。我们在Django的shell模式下简要尝试一下:
#导入分页功能模块
>>> from django.core.paginator import Paginator
#生成数据列表
>>> objects = [chr(x) for x in range(97,107)]
>>> objects
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
#将数据列表以每三个元素分为一页
>>> p = Paginator(objects, 3)
#输出全部数据,即整个数据列表
>>> p.object_list
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
#获取数据列表的长度
>>> p.count
10
#分页后的总页数
>>> p.num_pages
4
#将页数转换成range循环对象
>>> p.page_range
range(1, 5)
#获取第二页的数据信息
>>> page2 = p.page(2)
#判断第二页是否存在上一页
>>> page2.has_previous()
True
#如果当前页数存在上一页,就输出上一页的页数,否则抛出EmptyPage异常
>>> page2.previous_page_number()
1
#判断第二页是否存在下一页
>>> page2.has_next()
True
#如果当前页数存在下一页,就输出下一页的页数,否则抛出EmptyPage异常
>>> page2.next_page_number()
3
#输出第二页对应的数据内容
>>> page2.object_list
['d', 'e', 'f']
#输出第二页的第一条数据在整个数据列表的位置,数据位置从1开始计算
>>> page2.start_index()
4
#输出第二页的最后一条数据在整个数据列表的位置,数据位置从1开始计算
>>> page2.end_index()
6
上述代码就是Django分页功能的使用方法,根据对象类型可以将代码分为两部分:分页对象p和某分页对象page2,两者说明如下:
分页对象p
由模块Paginator实例化生成,在实例化时,需要传入参数object和per_page,前者是待分页的数据对象,后者用于设置每页的数据量。提供了如下属性或函数:
函数 | 说明 |
---|---|
object_list | 输出被分页的全部数据,即数据列表objects |
count | 获取当前被分页的数据总量,即数据列表objects的长度 |
num_pages | 获取分页后的总页数 |
page_range | 将总页数转换成range循环对象 |
page(number) | 获取某一页的数据对象,参数number代表页数 |
某分页对象page2
由对象p使用函数page所生成的对象。page2提供如下属性或函数:
函数 | 说明 |
---|---|
has_previous() | 判断当前页数是否存在上一页 |
previous_page_number() | 如果当前页数存在上一页,输出上一页的页数,否则抛出EmptyPage异常 |
has_next() | 判断当前页数是否存在下一页 |
next_page_number() | 如果当前页数存在下一页,输出下一页的页数,否则抛出EmptyPage异常 |
object_list | 输出当前分页的数据信息 |
start_index() | 输出当前分页的第一条数据在整个数据列表的位置,数据位置从1开始计算 |
end_index() | 输出当前分页的最后一条数据在整个数据列表的位置,数据位置从1开始计算 |
下面通过一个简单的示例来演示如何在开发过程中使用Django内置分页功能。我们在mysite项目的index中添加模板pagination.html,然后在index的urls.py中添加如下URL配置信息:
#index 的 urls.py
path('pagination/.html', views.paginationView, name='pagination'),
上面的配置信息中,url部分有一个页数的变量。接下来编写对应的视图文件
#index 的 views.py
#导入Pagination模块
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
def paginationView(request,page):
#获取数据表index_product的全部数据
product_list = Product.objects.all()
#设置每一页的数据量为3
paginator = Paginator(product_list, 3)
try:
pageInfo = paginator.page(page)
except PageNotAnInteger:
#如果参数page的数据类型不是整型,就返回第一页的数据
pageInfo = paginator.page(1)
except EmptyPage:
#若用户访问的页数大于实际页数,则返回最后一页的数据
pageInfo = paginator.page(paginator.num_pages)
return render(request, 'pagination.html', locals())
最后编辑模板文件pagination.html。
Django分页
产品名称
重量
尺寸
产品类型
{# 列出当前分页所对应的数据内容 #}
{% for item in pageInfo %}
{{ item.name }}
{{ item.weight }}
{{ item.size }}
{{ item.type }}
{% endfor %}
{# 分页导航 #}
简单的实现效果如下:
页码数过多时隐藏部分页码的一个思路,不需要用到java技术:
后台根据当前页码返回一个以当前页码为中心点的range(),具体示例如下:
#my_func.py自定义函数,返回一个页码range()
def page_num_list(total_pages,current_page):
if total_pages <= 10:#如果总页码数低于10页全部显示页码,总页码数大于10页否则
page_list = range(1,total_pages+1)
else:
if current_page <=5:#如果当前页码数在5页以内,则显示1-10页。
page_list = range(1,10)
elif current_page >=6 and current_page <= total_pages-5:#如果当前页码数大于6页且小于总页码数-5,则显示当前页码及其前后各5页。
page_list = range(current_page-5,current_page+5)
else:#如果当前页码在总页码范围10页以内,显示倒数10页。
page_list = range(total_pages-9,total_pages+1)
return (page_list)
#views.py
from jxrsc.my_func import page_num_list#导入自定义函数
def allfundView(request, page):
fund_list = Fund.objects.all().order_by('-id')
paginator = Paginator(fund_list, 10, 2)
#调用自定义函数page_num_list,根据当前页码位置返回一定的页码范围
page_lists = page_num_list(paginator.num_pages,page)
try:
pageInfo = paginator.page(page)
except PageNotAnInteger:
#如果参数page的数据类型不是整型,就返回第一页的数据
pageInfo = paginator.get_page(1)
except EmptyPage:
#若用户访问的页数大于实际页数,则返回最后一页的数据
pageInfo = paginator.get_page(paginator.num_pages)
return render(request, 'allfund.html', locals())
#template.html
{# 分页 #}