1 Django 的分页器 (paginator) 简介
2 应用 View 层
3 模版层 index.html
4 扩展
回到目录
1 Django 的分页器 (paginator) 简介
在页面显示分页数据, 需要用到 Django 分页器组件
from django.core.paginator import Paginator
Paginator 对象: paginator = Paginator(user_list, 10)
- # per_page: 每页显示条目数量
- # count: 数据总个数
- # num_pages: 总页数
- # page_range: 总页数的索引范围, 如: (1,10),(1,200)
- # page: page 对象
page 对象: page=paginator.page(1)
- # has_next 是否有下一页
- # next_page_number 下一页页码
- # has_previous 是否有上一页
- # previous_page_number 上一页页码
- # object_list 分页之后的数据列表
- # number 当前页
- # paginator paginator 对象
回到目录
2 应用 View 层
- from django.shortcuts import render,HttpResponse
- # Create your views here.
- from app01.models import *
- from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
- def index(request):
- '''
- 批量导入数据:
- Booklist=[]
- for i in range(100):
- Booklist.append(Book(title="book"+str(i),price=30+i*i))
- Book.objects.bulk_create(Booklist)
- ''''''
- 分页器的使用:
- book_list=Book.objects.all()
- paginator = Paginator(book_list, 10)
- print("count:",paginator.count) #数据总数
- print("num_pages",paginator.num_pages) #总页数
- print("page_range",paginator.page_range) #页码的列表
- page1=paginator.page(1) #第 1 页的 page 对象
- for i in page1: #遍历第 1 页的所有数据对象
- print(i)
- print(page1.object_list) #第 1 页的所有数据
- page2=paginator.page(2)
- print(page2.has_next()) #是否有下一页
- print(page2.next_page_number()) #下一页的页码
- print(page2.has_previous()) #是否有上一页
- print(page2.previous_page_number()) #上一页的页码
- # 抛错
- #page=paginator.page(12) # error:EmptyPage
- #page=paginator.page("z") # error:PageNotAnInteger
- '''
- book_list=Book.objects.all()
- paginator = Paginator(book_list, 10)
- page = request.GET.get('page',1)
- currentPage=int(page)
- 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",{"book_list":book_list,"paginator":paginator,"currentPage":currentPage})
回到目录
3 模版层 index.HTML
- <!DOCTYPE HTML>
- <HTML lang="en">
- <head>
- <meta charset="UTF-8">
- <title>
- Title
- </title>
- <link rel="stylesheet" href="https://cdn.bootCSS.com/bootstrap/3.3.7/css/bootstrap.min.css"
- integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
- crossorigin="anonymous">
- </head>
- <body>
- <div class="container">
- <h4>
- 分页器
- </h4>
- <ul>
- {% for book in book_list %}
- <li>
- {{ book.title }} -----{{ book.price }}
- </li>
- {% endfor %}
- </ul>
- <ul class="pagination" id="pager">
- {% if book_list.has_previous %}
- <li class="previous">
- <a href="/index/?page={{ book_list.previous_page_number }}">
- 上一页
- </a>
- </li>
- {% else %}
- <li class="previous disabled">
- <a href="#">
- 上一页
- </a>
- </li>
- {% endif %} {% for num in paginator.page_range %} {% if num == currentPage
- %}
- <li class="item active">
- <a href="/index/?page={{ num }}">
- {{ num }}
- </a>
- </li>
- {% else %}
- <li class="item">
- <a href="/index/?page={{ num }}">
- {{ num }}
- </a>
- </li>
- {% endif %} {% endfor %} {% if book_list.has_next %}
- <li class="next">
- <a href="/index/?page={{ book_list.next_page_number }}">
- 下一页
- </a>
- </li>
- {% else %}
- <li class="next disabled">
- <a href="#">
- 下一页
- </a>
- </li>
- {% endif %}
- </ul>
- </div>
- </body>
- </HTML>
回到目录
4 扩展
'''
显示左 5, 右 5, 总共 11 个页,
1 如果总页码大于 11
1.1 if 当前页码减 5 小于 1, 要生成 1 到 12 的列表(顾头不顾尾, 共 11 个页码)
page_range=range(1,12)
1.2 elif 当前页码 + 5 大于总页码, 生成当前页码减 10, 到当前页码加 1 的列表(顾头不顾尾, 共 11 个页码)
page_range=range(paginator.num_pages-10,paginator.num_pages+1)
1.3 else 生成当前页码 - 5, 到当前页码 + 6 的列表
page_range=range(current_page_num-5,current_page_num+6)
2 其它情况, 生成的列表就是 pageinator 的 page_range
page_range=paginator.page_range
'''
核心逻辑
- 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>11:
- 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())
- def page_test(request):
- # book_list=[]
- # for i in range(100):
- # book=Book(name='book%s'%i,price=10+i,pub_date='2018-09-18',publish_id=1)
- # book_list.append(book)
- # Book.objects.bulk_create(book_list,10)
- book_list=Book.objects.all()
- # 生成 paginator 对象, 传入书籍列表, 每页 10 条数据
- paginator=Paginator(book_list,3)
- # 总页码数
- print(paginator.num_pages)
- # 页码列表
- print(paginator.page_range)
- # 总数据
- print(paginator.count)
- # 获取页面传来的页码
- current_page=int(request.GET.get('page',1))
- page_range=[]
- # 左 5 右 5
- # 获取页面传来的页码的 page 对象
- try:
- page=paginator.page(current_page)
- # print(page.has_next()) #是否有下一页
- # print(page.next_page_number()) #下一页的页码
- # print(page.has_previous()) #是否有上一页
- # print(page.previous_page_number()) #上一页的页码
- # 循环打印出当页对象
- for i in page:
- print(i)
- except Exception as e:
- current_page=1
- page = paginator.page(1)
- if paginator.num_pages>11:
- if current_page+5>paginator.num_pages:
- page_range=range(paginator.num_pages-10,paginator.num_pages+1)
- elif current_page-5<1:
- page_range=range(1,12)
- else:
- page_range=range(current_page-5,current_page+6)
- else:
- page_range=paginator.page_range
- return render(request,'page_test.html',locals())
- views
- <!DOCTYPE HTML>
- <HTML lang="en">
- <head>
- <meta charset="UTF-8">
- <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
- <title>
- Title
- </title>
- </head>
- <body>
- <ul>
- {% for foo in page %}
- <li>
- {{ foo.name }}
- </li>
- {% endfor %}
- </ul>
- <nav aria-label="Page navigation">
- <ul class="pagination">
- {% if page.has_previous %}
- <li>
- <a href="/page_test/?page={{ page.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 current_page == foo %}
- <li class="active">
- <a href="/page_test/?page={{ foo }}">
- {{ foo }}
- </a>
- </li>
- {% else %}
- <li>
- <a href="/page_test/?page={{ foo }}">
- {{ foo }}
- </a>
- </li>
- {% endif %} {% endfor %} {% if page.has_next %}
- <li>
- <a href="/page_test/?page={{ page.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>
- </body>
- </HTML>
模版
---------https://www.cnblogs.com/liuqingzheng/articles/9509767.html
来源: http://www.bubuko.com/infodetail-2875412.html