• (31)django中的分页器


    book_list = models.Book.objects.all()    #查出指定表中的所有数据
    paginator = Paginator(book_list,2)    #实例化对象,传入两个参数,一个就是获取到的所有数据,后面的数字就是每页显示的数据条数,意思就是要分页每页显示多少
    paginator.count    #数据的总条数
    paginator.num_pages   #分的总页数

    page_range    #是一个生成器,底层显示的是一个range(number,number)就是一个总页数的索引范围


    '''如果这里指明的页数是1,page后面获取上一页的页码数就会报错,请try捕获即可'''
    page = paginator.page(3)     #page是一个对象,后面的参数就是要指明取的第几页的所有数据,每一页的数据就是一个对象
    page.object_list()    #第N页的所有数据
    page.has_next()   #是否有下一页有就是True
    page.has_previous()   #是否有上一页
    page.previous_page_number()   #上一页的页码数
    page.next_page_number()   #下一页页码数

     

    实例

    urls.py

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views

    urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^page_test/$', views.page_test)
    ]

    views.py

    from django.shortcuts import render,HttpResponse,redirect

    from django.core.paginator import Paginator #Paginator就是分页器是一个类
    from app01 import models


    def page_test(request):
    current_page = int(request.GET.get('page')) #这个就是取出前端传过来的页数,这里最好转成页数,这个就是当前页
    book_list = models.Book.objects.all() #查出指定表中的所有数据
    paginator = Paginator(book_list,1) #实例化对象,传入两个参数,一个就是获取到的所有数据,后面的数字就是每页显示的数据条数,意思就是要分页每页显示多少
    '''这里用if判断做页码总页数大于10就只显示10页,构造出分页数字显示一直在中间,如果小于10页就有几页显示几页'''
    if paginator.num_pages > 11: #如果总页数大于11
    if current_page-5 < 1: #如果当前页-5 < 1
    page_range = range(1,11) #则定义总页数的索引范围就是10页
    elif current_page + 5 > paginator.num_pages: #如果当前页+5大于总页数
    page_range = range(paginator.num_pages-10,paginator.num_pages+1) #总页数的索引范围是总页数-10,总页数+1,因为range的最后一个是不现实,所以要多一页才能显示最后一页
    else:
    page_range = range(current_page-5,current_page +6)
    else:
    page_range = paginator.page_range
    page = paginator.page(current_page) #page是一个对象,后面的参数就是要指明取的第几页的所有数据,每一页的数据就是一个对象,这里放入的是动态的,前端获取的
    return render(request,'page.html',locals())

    page.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
    <title>Title</title>
    </head>
    <body>
    <div>
    {#这里就是从后端获取数据#}
    {% for book in page.object_list %}
    <p>书名:{{ book.name }} </p>
    <p>价格:{{ book.price }}</p>
    <p>出版日期:{{ book.publish_date }}</p>
    <p>-------------------------------------</p>
    {% endfor %}
    </div>
    <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>
    <a href="#" aria-label="Previous">
    <span aria-hidden="true">上一页</span>
    </a>
    </li>
    {% endif %}

    {# 这里循环page_range总页数的索引范围,获取总页数,然后根据每页显示几条自动生成页数,动态生成页数 #}
    {% for foo in page_range %}
    {#这里用if判断,如果选中的页数,则获取类名,变色,反则不变色 #}
    {% if foo == current_page %}
    {#a标签获取地址后面拼接页数,就可以点击#}
    <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>
    <a href="#" aria-label="Next">
    <span aria-hidden="true">下一页</span>
    </a>
    </li>
    {% endif %}
    </ul>
    </nav>
    </body>
    </html>
    分页后端代码的逻辑

  • 相关阅读:
    extjs4 tree 父子节点联级勾选,半选节点半透明处理
    回调函数设计及应用(Java)——分组模式设计
    未来发展方向
    博客园网摘chrome插件源码分析
    apue2 阅读笔记第11章
    apue2 阅读笔记第八章
    APUE阅读笔记第十五章(第一部分)
    一个常用的vimrc
    apue2 阅读笔记第12章
    APUE阅读笔记第十四章(第二部分)
  • 原文地址:https://www.cnblogs.com/shizhengquan/p/10566041.html
Copyright © 2020-2023  润新知