web框架開發-分頁器(Paginator)

Django有自帶的分頁器,能夠將數據分在不一樣的頁面中,並提供一些屬性和方法實現對分頁數據的操做。分頁功能的類位於django/core/paginator.py中。css

經常使用方法

# 分頁器
    # paginator分頁器對象(obj,每頁條數)
    paginator = Paginator(book_list, 3)

    ################經常使用方法#################
    print("count:", paginator.count)  # 數據總數
    print("num_pages", paginator.num_pages)  # 總頁數
    print("page_range", paginator.page_range)  # 頁碼的列表

    #################提取某一頁具體數據的兩種方式#################
    # 方式1
    page1 = paginator.page(1)  # 第1頁的page對象
    for i in page1:  # 遍歷第1頁的全部數據對象
        print(i)
    # 方式2
    print(page1.object_list)  # 第1頁的全部數據



實例代碼

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>
<h3>圖書列表</h3>
    <ul>
        {% for book_obj in current_page %}
            <li>{{ book_obj.title }}:{{ book_obj.price }}</li>
        {% endfor %}
        
    </ul>

    <nav aria-label="Page navigation">
        <ul class="pagination">
{#              上一頁#}
        {% if current_page.has_previous %}
            <li>
                <a href="?page={{ current_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 page in page_range %}
{#                若是循環的頁碼等於當前的頁碼,就添加active#}
                {% if current_page_num == page%}
                    <li class="active"><a href="?page={{ page }}">{{ page }}</a></li>
                {% else %}
                    <li><a href="?page={{ page }}">{{ page }}</a></li>
                {% endif %}
            {% endfor %}

{#              下一頁#}
        {% if current_page.has_next %}
            <li>
                <a href="?page={{ current_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>


views.py

from django.shortcuts import render
from app01.models import *
from django.core.paginator import Paginator


# Create your views here.


def index(request):
    """
    批量導入數據到數據庫
    book_list=[]
    for i in range(100):
        book=Book(title="book%s"%i,price=i*i)
        book_list.append(book)
    Book.objects.bulk_create(book_list)
    :param request:
    :return:
    """
    # 拿到全部的數據書籍
    book_obj_list = Book.objects.all()
    # 生成分頁器對象
    paginator = Paginator(book_obj_list, 3)
    # 獲取瀏覽器端請求的頁碼,須要設置默認值
    current_page_num = int(request.GET.get('page', 1))
    # 當前頁的全部書對象
    current_page = paginator.page(current_page_num)
    # 頁碼列表,可迭代
    # 分頁過多,須要用條件判斷顯示的頁碼
    if paginator.num_pages > 11:  # 11就是顯示的固定個數
        if current_page_num - 5 < 1:  # 接近最小頁碼時,固定頁碼,不然會出現負數
            page_range = range(1, 12)
        elif current_page_num + 5 > paginator.num_pages: # 接近最大頁碼時,根據最大頁碼限制頁碼數,不然會出現不存在的頁碼
            page_range = range(paginator.num_pages - 10, paginator.num_pages + 1)
        else:
            page_range = range(current_page_num - 5, current_page_num + 6)  # 其餘狀況,顯示當前的挨着的幾個
    else:
        page_range = paginator.page_range  # 頁碼總數不足時,顯示所有,即不會超寬

    return render(request, 'index.html', locals())
相關文章
相關標籤/搜索