ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

44. Django 2.1.7 分页 Paginator

2021-06-18 10:53:53  阅读:205  来源: 互联网

标签:Paginator 44 list server item test 2.1 页码 page


watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

分页

Django提供了数据分页的类,这些类被定义在django/core/paginator.py中。

类Paginator用于对列进行一页n条数据的分页运算。

类Page用于表示第m页的数据。

Paginator类实例对象

  • 方法_init_(列表,int):返回分页对象,第一个参数为列表数据,第二个参数为每页数据的条数。
  • 属性count:返回对象总数。
  • 属性num_pages:返回页面总数。
  • 属性page_range:返回页码列表,从1开始,例如[1, 2, 3, 4]。
  • 方法page(m):返回Page类实例对象,表示第m页的数据,下标以1开始。

Page类实例对象

  • 调用Paginator对象的page()方法返回Page对象,不需要手动构造。
  • 属性object_list:返回当前页对象的列表。
  • 属性number:返回当前是第几页,从1开始。
  • 属性paginator:当前页对应的Paginator对象。
  • 方法has_next():如果有下一页返回True。
  • 方法has_previous():如果有上一页返回True。
  • 方法len():返回当前页面对象的个数。

示例 - 使用交互模式使用一下分页功能

# 引入Paginator
In [37]: from django.core.paginator import Paginator

# 创建四个数据的list
In [38]: objects = ['john', 'paul', 'george', 'ringo']

# 设置分页显示条数为2
In [39]: p = Paginator(objects, 2)

# 查看对象总数
In [40]: p.count
Out[40]: 4

# 返回页面总数
In [41]: p.num_pages
Out[41]: 2

In [42]: type(p.page_range)
Out[42]: range

# 返回页码列表,从1开始,例如[1, 2, 3, 4]
In [43]: p.page_range
Out[43]: range(1, 3)

# 可以看到页码只有 1 ,2
In [45]: for item in p.page_range:
...: print(item)
...:
1
2

# 查看页码1的数据
In [46]: page1 = p.page(1)

In [47]: page1
Out[47]: <Page 1 of 2>

In [48]: page1.object_list
Out[48]: ['john', 'paul']

# 查看页码2的数据
In [49]: page2 = p.page(2)

In [50]: page2.object_list
Out[50]: ['george', 'ringo']

# 页码2,如果有下一页返回True
In [51]: page2.has_next()
Out[51]: False

# 页码2,如果有上一页返回True
In [52]: page2.has_previous()
Out[52]: True

In [53]: page2.has_other_pages()
Out[53]: True

In [6]: page2.next_page_number()
---------------------------------------------------------------------------
EmptyPage Traceback (most recent call last)
...
EmptyPage: 本页结果为空

# 页码2,上一页的页码
In [7]: page2.previous_page_number()
Out[7]: 1

# The 1-based index of the first item on this page
In [8]: page2.start_index()
Out[8]: 3

# The 1-based index of the last item on this page
In [9]: page2.end_index()
Out[9]: 4


在视图中使用 Paginator

1)在assetinfo/views.py文件中创建视图page_test。

from assetinfo.models import ServerInfo
from django.core.paginator import Paginator

def page_test(request):
#查询所有的服务器信息
server_list = ServerInfo.objects.all()
#将地区信息按一页2条进行分页
p = Paginator(server_list, 2)
#获取第1页的数据
page_list = p.page(1).object_list
#将当前页码、当前页的数据、页码信息传递到模板中
return render(request, 'assetinfo/page_test.html', {'page_list': page_list})

2)在assetinfo/urls.py文件中配置url。

urlpatterns = [
# ex:/assetinfo/page_test
path('page_test/', views.page_test, name='page_test'),
]

3)在templates/assetinfo/目录下创建page_test.html模板文件。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>分页</title>
</head>
<body>
显示第一页的服务器信息:<br>
<ul>
{%for item in page_list%}
<li>{{forloop.counter}}--{{item}}--{{ item.server_intranet_ip }}--{{ item.server_internet_ip }}</li>
{%endfor%}
</ul>
</body>
</html>

4)运行服务器,在浏览器中输入如下网址:http://127.0.0.1:8000/assetinfo/page_test/

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

这是写第一页的查询数据,下面来看看写第二页的数据。

5)在assetinfo/views.py文件中修改视图page_test。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

6)在浏览器刷新如下:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

下面来设置访问的页码来改变查询的数据,并查询显示页码。

7)在assetinfo/views.py文件中修改视图page_test。

def page_test(request):
#设置接收页码
page_Index = request.GET.get('page')
#查询所有的服务器信息
server_list = ServerInfo.objects.all()
#将地区信息按一页2条进行分页
p = Paginator(server_list, 2)
#获取第page_Index页的数据
server_page_list = p.get_page(page_Index)
#将当前页码、当前页的数据、页码信息传递到模板中
return render(request, 'assetinfo/page_test.html', {'server_page_list': server_page_list})

8)在templates/assetinfo/目录下修改page_test.html模板文件。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>分页</title>
</head>
<body>

<ul>
{%for item in server_page_list%}
<li>{{forloop.counter}}--{{item}}--{{ item.server_intranet_ip }}--{{ item.server_internet_ip }}</li>
{%endfor%}
</ul>

{% if server_page_list.has_previous %}
<a href="?page=1">&laquo; first</a>
<a href="?page={{ server_page_list.previous_page_number }}">previous</a>
{% endif %}

<span class="current">
Page {{ server_page_list.number }} of {{ server_page_list.paginator.num_pages }}.
</span>

{% if server_page_list.has_next %}
<a href="?page={{ server_page_list.next_page_number }}">next</a>
<a href="?page={{ server_page_list.paginator.num_pages }}">last &raquo;</a>
{% endif %}

</body>
</html>

9)在浏览器访问如下:http://127.0.0.1:8000/assetinfo/page_test?page=1

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

点击查询下一页。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

 

标签:Paginator,44,list,server,item,test,2.1,页码,page
来源: https://blog.51cto.com/u_11239407/2920434

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有