django之Paginator分页器-65

一.分页器

分页功能是所有网页上都需要提供的功能,当要展示的条目比较多时,就需要进行分页,不但能减小数据库读取数据压力,也有利于用户浏览。
Django为我们提供了一个Paginator分页工具,这个类帮助我们来管理分页数据,该类存放在django/core/paginator.py它可以接收列表、元组或其他可迭代对象。

实例:

from django.core.paginator import Paginator
lis = ['yven','lqz','egon','hwt','lyf'] # 对lis进行分页,每页2条数据 p = Paginator(lis,2) # 每页显示条目数量,显示2 print(p.per_page) # page对象 print(p.page) # 对象的个数,显示5 print(p.count) # 总共几页,显示3 print(p.num_pages) # 分页范围,返回一个可迭代对象 显示range(1,4) print(p.page_range) # 获取第一页 page1 = p.page(1) # 显示<Page 1 of 3> print(page1) # 获取第一页的对象 显示['yven', 'lqz'] print(page1.object_list) page2 = p.page(2) # 当前页页码 显示2 print(page2.number) # paginator对象 print(page2.paginator) print(page2.object_list) #['egon', 'hwt'] # 判断是否有下一页 显示True print(page2.has_next()) # 判断是否有上一页 显示True print(page2.has_previous()) # 判断是否其他页 显示True print(page2.has_other_pages()) # 获取下一页页码 显示3 print(page2.next_page_number()) # 获取上一页页码 显示1 print(page2.previous_page_number())

所以,使用Paginator分四步:

使用任何方法,获取要展示的对象列表QuerySet;

将列表和每页个数传递给Paginator,返回一个分页对象;

调用该对象的各种方法,获取各种分页信息;

在HTML模板中,使用上面的分页信息构建分页栏。

二.使用Paginator

批量导入数据

需要插入需要调数据时,大部分人会想到使用循环来插入输入,但这样会影响效率,因为每次循环都会去找到那张表,再进行插入记录,所以这时就可以使用bulk_create实现批量插入,效率会更高。

def index(request): book_list = [] for i in range(100): book_list.append(models.Book(name='图书%s'%i,price=10+i)) models.Book.objects.bulk_create(book_list) return HttpResponse('ok')

将图书列表中的数据分页展示出来,每页3个数据

视图层:

def index(request): book_list = models.Book.objects.all().order_by('id') # 每页显示3条 paginator = Paginator(book_list, 3) try: # 前端返回页码 page = int(request.GET.get('page')) current = paginator.page(page) # 判断总页码数是否大于9 if paginator.num_pages > 9: # 判断页码是否小于5 if page < 5: page_range = range(1, 10) elif page + 4 > paginator.num_pages: page_range = range(paginator.num_pages - 8, paginator.num_pages + 1) else: page_range = range(page - 4, page + 5) else: # 小于9页,有多少页就显示多少页 page_range=paginator.page_range except Exception as e: page = 1 current = paginator.page(page) if paginator.num_pages > 9: if page < 5: print('aaa') page_range = range(1, 10) else: page_range = paginator.page_range return render(request, 'index.html', locals())

模板层

<table class="table table-hover"> <tr> <th>id</th> <th>书名</th> <th>单价</th> </tr> {% for book in current %} <tr> <td>{{ forloop.counter }}</td> <td>{{ book.name }}</td> <td>{{ book.price }}</td> </tr> {% endfor %} </table> <nav aria-label="Page navigation"> <ul class="pagination"> {% if current.has_previous %} <li> <a href="/index/?page={{ current.previous_page_number }}" aria-label="Previous"> <span aria-hidden="true">上一页</span> </a> </li> {% else %} <li class="disabled"> <a href="" aria-label="Previous"> <span aria-hidden="true">上一页</span> </a> </li> {% endif %} {% for foo in page_range %} {% if page == foo %} <li class="active"><a href="/index/?page={{ foo }}">{{ foo }}</a></li> {% else %} <li><a href="/index/?page={{ foo }}">{{ foo }}</a></li> {% endif %} {% endfor %} {% if current.has_next %} <li> <a href="/index/?page={{ current.next_page_number }}" aria-label="Next"> <span aria-hidden="true">下一页</span> </a> </li> {% else %} <li class="disabled"> <a href="" aria-label="Next"> <span aria-hidden="true">下一页</span> </a> </li> {% endif %} </ul> </nav>

三.Paginator对象

Paginator类拥有以下方法和属性:
属性:
count:对象的个数
num_pages:页面总数
page_range:基于1的页数范围迭代器 方法: Paginaor.page(number):返回指定页面的对象列表

四.异常处理

在实例使用中,用户请求的页面,可能千奇百怪,这就会有可能导致异常,需要特别处理,Django为我们内置了下面几个Paginator相关异常。
1.exception InvalidPage[source]:异常的基类,当paginator传入一个无效的页码时抛出。 2.exception PageNotAnInteger[source]:当向page()提供一个不是整数的值时抛出。 3.exception EmptyPage[source]:当向page()提供一个有效值,但是那个页面上没有任何对象时抛出。
posted on 2018-12-27 21:40 漫天飞雪世情难却 阅读( ...) 评论( ...)   编辑 收藏

转载于:https://www.cnblogs.com/jokezl/articles/10187579.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值