13.Django-分頁

平仄平仄平平仄發表於2020-06-14

使用Django實現分頁器功能

要使用Django實現分頁器,必須從Django中匯入Paginator模組

from django.core.paginator import Paginator

假如現在有150條記錄要顯示,每頁顯示10條

>>> from django.core.paginator import Paginator#匯入Paginator模組
>>> list1=[i for i in range(0,150)]#使用列表生成器生成一個包含150個數字的列表
>>> page1=Paginator(list1,10)#生成一個Paginator物件
>>> print(page1.count)#列印總的記錄數,即列表list1的長度
150
>>> print(page1.num_pages)#列印總的頁數,即總記錄數除以每頁顯示的條目數
15
>>> print(page1.page_range)#頁數的列表
range(1, 16)
>>> print(page1.page(1))#列印第一頁的page物件
<Page 1 of 15>
>>> page1.page(1).object_list#列印第一頁的所有記錄
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> page1.page(2).object_list#列印第二頁的所有記錄
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> page1.page(2).next_page_number()#列印當前的頁(第2頁)的下一頁的頁碼
3
>>> page1.page(2).has_next()#第2頁是否有下一頁
True
>>> page1.page(2).has_previous()#第2頁是否有上一頁
True
>>> page1.page(2).has_other_pages()#第2是否有其他頁
True
>>> page1.page(2).start_index()#第2頁第一條記錄的序號
11
>>> page1.page(2).end_index()#第2頁最後一條記錄的序號
20
>>> page1.page(0)#第0頁是否有記錄,會報錯
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
	...
	raise EmptyPage(_('That page number is less than 1'))
django.core.paginator.EmptyPage: <exception str() failed>
>>> page1.page(15)#列印第15頁的物件
<Page 15 of 15>

例子,使用Django實現一個分頁效果

前端程式碼:

{% load staticfiles %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.css' %}">
</head>
<body>
    <div class="container">
        <h4>分頁器</h4>
        <ul>
	    #遍歷boot_list中的所有元素
            {% 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="/?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="/?page={{ num }}">{{ num }}</a></li>
                {% else %}
                    <li class="item"><a href="/?page={{ num }}">{{ num }}</a></li>

                {% endif %}
            {% endfor %}
            {#頁碼結束#}
            {# 下一頁按鈕開始#}
            {% if book_list.has_next %}
                <li class="next"><a href="/?page={{ book_list.next_page_number }}">下一頁</a></li>
            {% else %}
                <li class="next disabled"><a href="#">下一頁</a></li>
            {% endif %}
            {# 下一頁按鈕結束#}
        </ul>
    </div>
</body>
</html>

後端程式碼:

#匯入render和HttpResponse模組
from django.shortcuts import render,HttpResponse

#匯入Paginator,EmptyPage和PageNotAnInteger模組
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

#從Django專案的應用中匯入模組
from app01.models import *

def index(request):

    #獲取Book資料表中的所有記錄
    book_list=Book.objects.all()

    #生成paginator物件,定義每頁顯示10條記錄
    paginator = Paginator(book_list, 10)

    #從前端獲取當前的頁碼數,預設為1
    page = request.GET.get('page',1)
	
    #把當前的頁碼數轉換成整數型別
    currentPage=int(page)

    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",locals())