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>
简单的实现效果如下:



网友评论