Django之分页显示
分页:Django-进阶
Django的分页器(paginator)
分页器的基本使用:
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger book_list = [1,2,3,4,5,6,7,8,9,10,11,12,13] paginator = Paginator(book_list, 5) print("count:", paginator.count) # 数据总数 # count: 13 print("num_pages", paginator.num_pages) # 总页数 # num_pages 3 print("page_range", paginator.page_range) # 页码的列表 # page_range range(1, 3) page1 = paginator.page(1) # 第1页的page对象 for i in page1: # 遍历第1页的所有数据对象 print(i) # 1 # 2 # 3 # 4 # 5 print(page1.object_list) # 第1页的所有数据 # [1, 2, 3, 4, 5] page2 = paginator.page(2) print(page2.has_next()) # 是否有下一页 # True print(page2.next_page_number()) # 下一页的页码 # 2 print(page2.has_previous()) # 是否有上一页 # False print(page2.previous_page_number()) # 上一页的页码
# 抛错
#page=paginator.page(12) # error:EmptyPage
#page=paginator.page("z") # error:PageNotAnInteger
在django里面views视图:
from app01 import models # 导入Paginator,EmptyPage和PageNotAnInteger模块 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger def log_in(func): '''身份认证装饰器, :param func: :return: ''' def wrapper(request,*args,**kwargs): # if not request.session.get("is_login"): if not request.user.is_authenticated(): return redirect("/book/login/") return func(request,*args, **kwargs) return wrapper @log_in #book_list=log_in(book_list) def book_list(request): #方式一、取出所有书籍 # bookList=models.Book.objects.all() #返回值是QuerySet [obj1,obj2 ....] # return render(request, 'index.html',{"bookList":bookList}) #方式二、取出所有书籍(分页的形式) # 获取Book数据表中的所有记录 book_list = models.Book.objects.all() # 生成paginator对象,定义每页显示10条记录 paginator = Paginator(book_list, 10) # 从前端获取当前的页码数,默认为1 page = request.GET.get('page', 1) # 把当前的页码数转换成整数类型 currentPage = int(page) number=int((currentPage-1)*10) #每个条数据的编号(防止第二页从第一个开始) try: # print(page) book_list = paginator.page(page) # 获取当前页码的记录 except PageNotAnInteger: book_list = paginator.page(1) # 如果用户输入的页码不是整数时,显示第1页的内容 except EmptyPage: book_list = paginator.page(paginator.num_pages) # 如果用户输入的页数不在系统的页码列表中时,显示最后一页的内容 # return render(request, "index.html",{"bookList":book_list,"paginator":paginator,"currentPage":currentPage}) return render(request, "text.html",{"bookList":book_list,"paginator":paginator,"currentPage":currentPage,"number":number})
inde页面:
{% extends "template.html" %} #继承模板
{% block content %}
{# {{ block.super }}#}
<div class="row">
<div class="col-md-12 ">
<a href="/book/add/"><button class="btn btn-primary">添加书籍</button></a>
<table class="table table-hover">
<tr>
<th>编号</th>
<th>书名</th>
<th>出版日期</th>
<th>价格</th>
<th>出版社</th>
<th>作者</th>
<th>操作</th>
</tr>
{% for book_obj in bookList %}
<tr>
<td>{{ forloop.counter|add:number}}</td>
<td>{{ book_obj.title }}</td>
<td>{{ book_obj.pubDate|date:"Y-m-d" }}</td>
<td>{{ book_obj.price }}</td>
<td>{{ book_obj.publisher.name }}</td>
<td>
{% for author in book_obj.authors.all %}
{{ author.name }}
{% endfor %}
</td>
<td>
<a href="/book/edit/{{ book_obj.nid }}"><button class="btn btn-info">编辑</button></a>
<a href="/book/del/{{ book_obj.nid }}"><button class="btn btn-danger">删除</button></a>
</td>
</tr>
{% endfor %}
</table>
</div>
</div>
{% endblock content %}
扩展其他功能:
def index(request): book_list=Book.objects.all() paginator = Paginator(book_list, 15) page = request.GET.get('page',1) currentPage=int(page) # 如果页数十分多时,换另外一种显示方式 if paginator.num_pages>30: if currentPage-5<1: pageRange=range(1,11) elif currentPage+5>paginator.num_pages: pageRange=range(currentPage-5,paginator.num_pages+1) else: pageRange=range(currentPage-5,currentPage+5) else: pageRange=paginator.page_range try: print(page) book_list = paginator.page(page) except PageNotAnInteger: book_list = paginator.page(1) except EmptyPage: book_list = paginator.page(paginator.num_pages) return render(request,"index.html",locals())

浙公网安备 33010602011771号