Django分页器
程序员文章站
2022-05-07 22:01:27
一.分页器 实例: 所以,使用Paginator分四步: 使用任何方法,获取要展示的对象列表QuerySet; 将列表和每页个数传递给Paginator,返回一个分页对象; 调用该对象的各种方法,获取各种分页信息; 在HTML模板中,使用上面的分页信息构建分页栏。 二.使用Paginator 批量导 ......
一.分页器
分页功能是所有网页上都需要提供的功能,当要展示的条目比较多时,就需要进行分页,不但能减小数据库读取数据压力,也有利于用户浏览。 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()提供一个有效值,但是那个页面上没有任何对象时抛出。