zoukankan      html  css  js  c++  java
  • Django的分页器 paginator

    导入

    from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger

    Page对象

    Paginator.page()将返回一个Page对象,我们主要的操作都是基于Page对象的,它具有下面的方法和属性:

    方法:

    • Page.has_next()[source]:如果有下一页,则返回True。
    • Page.has_previous()[source]:如果有上一页,返回 True。
    • Page.has_other_pages()[source]:如果有上一页或下一页,返回True。
    • Page.next_page_number()[source]:返回下一页的页码。如果下一页不存在,抛出InvalidPage异常。
    • Page.previous_page_number()[source]:返回上一页的页码。如果上一页不存在,抛出InvalidPage异常。

    属性:

    • Page.object_list:当前页上所有对象的列表。
    • Page.number:当前页的序号,从1开始计数。
    • Page.paginator:当前Page对象所属的Paginator对象。

    Paginator对象

    Paginator类拥有以下方法和属性:

    方法:

    Paginator.page(number)[source]

    返回指定页面的对象列表,比如第7页的所有内容,下标以1开始。如果提供的页码不存在,抛出InvalidPage异常。

    属性:

    • Paginator.count:所有页面的对象总数。
    • Paginator.num_pages:页面总数。
    • Paginator.page_range:基于1的页数范围迭代器。

    处理异常

    在实际使用中,可能恶意也可能不小心,用户请求的页面,可能千奇百怪。正常我们希望是个合法的1,2,3之类,但请求的可能是‘apple’,‘1000000’,‘#’,这就有可能导致异常,需要特别处理。Django为我们内置了下面几个,Paginator相关异常。

    • exception InvalidPage[source]:异常的基类,当paginator传入一个无效的页码时抛出。
    • exception PageNotAnInteger[source]:当向page()提供一个不是整数的值时抛出。
    • exception EmptyPage[source]:当向page()提供一个有效值,但是那个页面上没有任何对象时抛出。

    使用

    book.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>book</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>
    <div class="container">
    
        <h4>分页器</h4>
         <table class="table table-striped table-bordered">
                    <thead>
                    <tr>
                        <th>编号</th>
                        <th>书籍名称</th>
                        <th>价格</th>
                        <th>出版日期</th>
    
                    </tr>
                    </thead>
                    <tbody>
    
           {% for book in books %}
                        <tr>
                            <td>{{ forloop.counter }}</td>
                            <td id="book_title">{{ book.title }}</td>
                            <td id="book_price">{{ book.price }}</td>
                            <td id="book_publishDate">{{ book.publishDate|date:'Y-m-d' }}</td>
    
    
                        </tr>
                    {% endfor %}
    
                    </tbody>
         </table>
    
    
        <ul class="pagination" id="pager">
                 <li><a href="?page=1" aria-label="Previous">
                    <span aria-hidden="true">首页</span>
                   </a></li>
    
                     {% if books.has_previous %}
                        <li class="previous"><a href="?page={{ books.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="?page={{ num }}">{{ num }}</a></li>
                         {% else %}
                           <li class="item"><a href="?page={{ num }}">{{ num }}</a></li>
    
                         {% endif %}
                     {% endfor %}
    
    
    
                     {% if books.has_next %}
                        <li class="next"><a href="?page={{ books.next_page_number }}">下一页</a></li>
                     {% else %}
                        <li class="next disabled"><a href="#">下一页</a></li>
                     {% endif %}
                 <li><a href="?page={{ paginator.num_pages }}" aria-label="Previous">
                    <span aria-hidden="true">末页</span>
                    </a></li>
    
                </ul>
    </div>
    
    
    
    </body>
    
    </html>

      

    url.py

    app_name = 'polls'
    urlpatterns = [
        path('', views.IndexView.as_view(), name='index'),
        path('<int:pk>/', views.DetailView.as_view(), name='detail'),
        path('<int:pk>/results/', views.ResultsView.as_view(), name='results'),
        path('<int:question_id>/vote/', views.vote, name='vote'),
        path('listbook/', views.listBook, name='listbook'),
    ]

    view.py

    from .models import Book
    from django.shortcuts import render
    from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
    
    def listBook(request):
        '''
            批量导入数据:
         '''
        book_l = []
        # for i in range(30):
        #     book_l.append(Book(title="book" + str(i), price=20 + i * 2))
        # Book.objects.bulk_create(book_l)
    
        book_list = Book.objects.all().order_by('nid')
        # # 分页器
        paginator = Paginator(book_list, 5)  # 每页显示5条
    
        # # 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 = request.GET.get('page', 1)
        currentPage = int(page)
    
        try:
            print(page)
            books = paginator.page(page)
            print(books)
        except PageNotAnInteger:
            # 如果请求的页数不是整数,返回第一页。
            books = paginator.page(1)
        except EmptyPage:
            # 如果请求的页数不在合法的页数范围内,返回结果的最后一页。
            books = paginator.page(paginator.num_pages)
    
        return render(request, 'polls/book.html', locals())
    

      

    如果页数比较多,可以使用下一种方式

    def listBook(request):
        '''
            批量导入数据:
         '''
        book_l = []
        # for i in range(30):
        #     book_l.append(Book(title="book" + str(i), price=20 + i * 2))
        # Book.objects.bulk_create(book_l)
    
        book_list = Book.objects.all().order_by('nid')
        # # 分页器
        paginator = Paginator(book_list, 5)  # 每页显示5条
    
        # # 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 = request.GET.get('page', 1)
        currentPage = int(page)
        # 当页数小于4页时,只显示4页
        print('currentPage=',currentPage )
        if paginator.num_pages > 3:
            if currentPage - 3 < 1:
                pageRange = range(1, 5)
            elif currentPage + 3 > paginator.num_pages:
                pageRange = range(currentPage - 3, paginator.num_pages + 1)
    
            else:
                pageRange = range(currentPage - 3, currentPage + 3)
    
        else:
            pageRange = paginator.page_range
        try:
            print(page)
            books = paginator.page(page)
            print(books)
        except PageNotAnInteger:
            # 如果请求的页数不是整数,返回第一页。
            books = paginator.page(1)
        except EmptyPage:
            # 如果请求的页数不在合法的页数范围内,返回结果的最后一页。
            books = paginator.page(paginator.num_pages)
    
        return render(request, 'polls/book.html', locals())

    html

    <ul class="pagination" id="pager">
                 <li><a href="?page=1" aria-label="Previous">
                    <span aria-hidden="true">首页</span>
                   </a></li>
    
                     {% if books.has_previous %}
                        <li class="previous"><a href="?page={{ books.previous_page_number }}">上一页</a></li>
                     {% else %}
                        <li class="previous disabled"><a href="#">上一页</a></li>
                     {% endif %}
    
                {% for item in pageRange %}
                    {% if currentPage == item %}
                        <li class="active"><a href="?page={{ item }}">{{ item }}</a></li>
                    {% else %}
                        <li><a href="?page={{ item }}">{{ item }}</a></li>
                    {% endif %}
                {% endfor %}
    
    
    
                     {% if books.has_next %}
                        <li class="next"><a href="?page={{ books.next_page_number }}">下一页</a></li>
                     {% else %}
                        <li class="next disabled"><a href="#">下一页</a></li>
                     {% endif %}
                 <li><a href="?page={{ paginator.num_pages }}" aria-label="Previous">
                    <span aria-hidden="true">末页</span>
                    </a></li>
    
                </ul>

     

  • 相关阅读:
    Hdu 5396 Expression (区间Dp)
    Lightoj 1174
    codeforces 570 D. Tree Requests (dfs)
    codeforces 570 E. Pig and Palindromes (DP)
    Hdu 5385 The path
    Hdu 5384 Danganronpa (AC自动机模板)
    Hdu 5372 Segment Game (树状数组)
    Hdu 5379 Mahjong tree (dfs + 组合数)
    Hdu 5371 Hotaru's problem (manacher+枚举)
    Face The Right Way---hdu3276(开关问题)
  • 原文地址:https://www.cnblogs.com/xiao-apple36/p/11560310.html
Copyright © 2011-2022 走看看