Django 分页,django查询结果分页
当一个页面有太多数据项要显示时,它不能显示在一个页面上。这时候页面往往以分页的形式显示,然后每页显示二五十条数据。在网站上,分页随处可见。看起来是这样的:
这种实现既提高了用户体验,又减轻了数据库读取数据的压力。Django自带了一个分页工具,叫做Paginator,方便我们实现分页功能。本文介绍了如何使用Paginator实现分页功能。
1 Paginator
Paginator类用于将我们需要分页的数据分成几个部分。当我们实现Paginator类的实例时,我们需要向Paginator传递两个参数。第一个参数是数据源,可以是列表、元组和查询结果集QuerySet。第二个参数需要传入一个整数,指示每页显示的数据条的数量。具体写法如下:
book_list=[]
x在范围(1,26) : #总共25本书
book_list.append(Book str(x))
#按规定每页显示10条数据,并进行划分。
paginator=Paginator(book_list,10)
在上面的代码中,我们传入一个名为book_list的列表,其中包含25本书。然后我们设置Paginator每页显示10条数据,最后得到一个Paginator的实例。
此外,Paginator类中有三个常用的属性,它们是:
Count:表示所有页面上的对象总数。
Num_pages:表示总页数。
Page_range:下标从1开始的页范围的迭代器。
2 Page 对象
Paginator类提供了一个** Page(number) **函数,返回一个Page对象。number参数表示页码。如果number=1,那么page()返回的对象就是第一页的Page对象。为了在前端页面中显示数据,我们的主要操作是基于页面对象的。具体用法如下:
#使用paginator对象返回第1页上的page对象。
books=paginator.page(1)
Page对象有三个常用属性:
代表当前页面上所有对象的列表。
Numberv:表示当前页面的序列号,从1开始计数。
Paginator:当前页面对象所属的分页器对象。
此外,Page对象还有几个常用的函数:
Has_next():确定是否有另一个页面,如果有,返回True。
Has_previous():判断是否有上一页,如果有,返回True。
Has_other_pages():判断是上一页还是下一页,如果是,返回True。
Next_page_number():返回下一页的页码。如果下一页不存在,则引发InvalidPage异常。
Previous_page_number():返回上一页的页码。如果上一页不存在,则引发InvalidPage异常。
相关:《Python视频教程》
3 运用
下面是自己写的一个演示程序,介绍了Paginator和Page如何配合使用。
3.1 视图
获取views.py中要显示的所有数据,然后使用Paginator类对数据进行分页,最后返回page 1上的page对象。Page的功能很大,一方面显示当前分页数据,同时也提供了获取后续页面数据的接口。
fromdjango . core . paginatorimportpaginator,PageNotAnInteger,EmptyPage,InvalidPage
from django . httpimporthttpresponse
fromdjango . shortcutsimportrender
defpaginator_view(请求):
book_list=[]
数据通常来自m。
odels中获取。这里为了方便,直接使用生成器来获取数据。
'''
forxinrange(1,26):#一共25本书
book_list.append('Book'+str(x))
#将数据按照规定每页显示10条,进行分割
paginator=Paginator(book_list,10)
ifrequest.method=="GET":
#获取url后面的page参数的值,首页不显示page参数,默认值是1
page=request.GET.get('page')
try:
books=paginator.page(page)
#todo:注意捕获异常
exceptPageNotAnInteger:
#如果请求的页数不是整数,返回第一页。
books=paginator.page(1)
exceptInvalidPage:
#如果请求的页数不存在,重定向页面
returnHttpResponse('找不到页面的内容')
exceptEmptyPage:
#如果请求的页数不在合法的页数范围内,返回结果的最后一页。
books=paginator.page(paginator.num_pages)
template_view='page.html'
returnrender(request,template_view,{'books':books})3.2 模板
模板的工作就是在 HTML 页面中填充数据。当拿到视图传递过来的 books(books 是一个 Page 对象), 就在 for 循环中打印数据。最后使用 books 根据页面情况展示上一页按钮,当前页数,总页数,下一页按钮。
{%loadstaticfiles%}
3.3 运行结果
我在 urls.py 中配置当前的 app 访问路径是 paginator/。所以使用浏览器访问地址 http://127.0.0.1:8000/paginator/, 看到访问结果如下:
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。