美文网首页
(14)Django - 分页功能

(14)Django - 分页功能

作者: libdream | 来源:发表于2019-03-14 15:12 被阅读0次

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/<int:page>.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。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"> 
<title>Django分页</title>
<style>
#customers
{
    width:100%;
    border-collapse:collapse;
}
#customers td, #customers th 
{
    font-size:1em;
    border:1px solid #98bf21;
    padding:3px 7px 2px 7px;
}
#customers th 
{
    font-size:1.1em;
    text-align:left;
    padding-top:5px;
    padding-bottom:4px;
    background-color:#A7C942;
    color:#ffffff;
}
</style>
</head>

<body>
<table id="customers">
<tr>
  <th>产品名称</th>
  <th>重量</th>
  <th>尺寸</th>
  <th>产品类型</th>
</tr>
{# 列出当前分页所对应的数据内容 #}
{% for item in pageInfo %}
<tr>
<td>{{ item.name }}</td>
<td>{{ item.weight }}</td>
<td>{{ item.size }}</td>
<td>{{ item.type }}</td>
</tr>
{% endfor %}
</table>

{# 分页导航 #}
<div style="">
{# 上一页的URL地址 #}
{% if pageInfo.has_previous %}
    <a href="{% url 'pagination' pageInfo.previous_page_number %}">上一页</a>
{% endif %}
{# 列出所有的URL地址 #}
{% for num in pageInfo.paginator.page_range %}
    {% if num == pageInfo.number %}
        <span>{{ pageInfo.number }}</span>
    {% else %}
        <a href="{% url 'pagination' num %}" target="_self">{{ num }}</a>
    {% endif %}
{% endfor %}
{# 下一页的URL地址 #}
{% if pageInfo.has_next %}
    <a href="{% url 'pagination' pageInfo.next_page_number %}">下一页</a>
{% endif %}
</div>

</body>
</html>

简单的实现效果如下:


第一页
中间页
最后一页

相关文章

  • (14)Django - 分页功能

    Django已为开发者内置了分页功能,只需调用Django内置分页功能的函数即可实现数据分页功能。我们在Djang...

  • 第20天,分页器

    本篇写了使用Django自有的分页器paginator的用法和自定制分页器 1.1 Django之分页功能 Dj...

  • 最浅显易懂的Django系列教程(33)-分页

    分页 在Django中实现分页功能非常简单。因为Django已经内置了两个处理分类的类。分别是Paginator和...

  • 关于Django框架中分页器的使用

    最近搬码的时候需要在Django框架中用到分页功能,于是就去百度了一下。 django框架中实现分页功能可以有很多...

  • django分页功能

    Django中已经实现了很多功能,基本上只要我们需要的功能,都能够找到相应的包。要在Django中实现分页显示,只...

  • Django分页功能

    之前分页功能都是自己写的,后来觉得不对,这么牛逼的框架不带分页功能是不是说不过去,于是乎... ... 果然有。 ...

  • Django: 分页功能

    成果: 代码:在之后的步骤中在相信说明吧 步骤: 1.这个mongoengine需要pip安装的pip insta...

  • 7.drf分页

    drf分页功能 文档 地址:http://www.django-rest-framework.org/api-gu...

  • Django 实现分页功能

    当页面因需要展示的数据条目过多,导致无法在一个页面全部显示。这时,页面经常会采用分页形式进行展示,然后每页显示 2...

  • django分页功能详解

    python shell模式下导入django下的Paginator模块 python shell模式下导入需要展...

网友评论

      本文标题:(14)Django - 分页功能

      本文链接:https://www.haomeiwen.com/subject/gayqmqtx.html