(14)Django - 分页功能

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 %}

{% endfor %}
产品名称 重量 尺寸 产品类型
{{ item.name }} {{ item.weight }} {{ item.size }} {{ item.type }}
{# 分页导航 #}
{# 上一页的URL地址 #} {% if pageInfo.has_previous %} 上一页 {% endif %} {# 列出所有的URL地址 #} {% for num in pageInfo.paginator.page_range %} {% if num == pageInfo.number %} {{ pageInfo.number }} {% else %} {{ num }} {% endif %} {% endfor %} {# 下一页的URL地址 #} {% if pageInfo.has_next %} 下一页 {% endif %}

简单的实现效果如下:


第一页

中间页

最后一页

页码数过多时隐藏部分页码的一个思路,不需要用到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
{# 分页  #}
  

你可能感兴趣的:((14)Django - 分页功能)