Django 分页,django查询结果分页

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: