溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django實現(xiàn)分頁功能的方法

發(fā)布時間:2020-07-31 14:42:23 來源:億速云 閱讀:161 作者:清晨 欄目:編程語言

這篇文章主要介紹Django實現(xiàn)分頁功能的方法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

當頁面因需要展示的數(shù)據條目過多,導致無法在一個頁面全部顯示。這時,頁面經常會采用分頁形式進行展示,然后每頁顯示 20 或者 50 等條數(shù)據。分頁經常在網站上隨處可見,它大概是這樣子:

Django實現(xiàn)分頁功能的方法

這樣的實現(xiàn)不僅提高了用戶體驗,還是減輕數(shù)據庫讀取數(shù)據的壓力。Django 自帶名為 Paginator 的分頁工具, 方便我們實現(xiàn)分頁功能。本文就講解如何使用 Paginator 實現(xiàn)分頁功能。

1 Paginator

Paginator 類的作用是將我們需要分頁的數(shù)據分割成若干份。當我們實現(xiàn)化一個 Paginator 類的實例時,需要給 Paginator 傳入兩個參數(shù)。第一個參數(shù)是數(shù)據源,可以是一個列表、元組、以及查詢結果集 QuerySet。第二個參數(shù)需要傳入一個整數(shù),表示每頁顯示數(shù)據條數(shù)。具體寫法如下:

book_list = []

for x in range(1, 26):  # 一共 25 本書

    book_list.append('Book ' + str(x))

# 將數(shù)據按照規(guī)定每頁顯示 10 條, 進行分割

paginator = Paginator(book_list, 10)

上面代碼中,我們傳入一個名為 book_list 的列表,該列表中含有 25 本書,然后我們給 Paginator 設定每頁顯示 10 條數(shù)據,最后得到一個 Paginator 實例。

另外 Paginator 類中有三個常用的屬性,它們分別是:

count:表示所有頁面的對象總數(shù)。

num_pages: 表示頁面總數(shù)。

page_range: 下標從 1 開始的頁數(shù)范圍迭代器。

2 Page 對象

Paginator 類提供一個** page(number) **函數(shù),該函數(shù)返回就是一個 Page 對象。參數(shù) number 表示第幾個分頁。如果 number = 1,那么 page() 返回的對象是第一分頁的 Page 對象。在前端頁面中顯示數(shù)據,我們主要的操作都是基于 Page 對象。具體用法如下:

# 使用  paginator 對象返回第 1 頁的 page 對象

books = paginator.page(1)

Page 對象有三個常用的屬性:

object_list: 表示當前頁面上所有對象的列表。

numberv: 表示當前頁的序號,從 1 開始計數(shù)。

paginator: 當前 Page 對象所屬的 Paginator 對象。

除此之外,Page 對象還擁有幾個常用的函數(shù):

has_next(): 判斷是否還有下一頁,有的話返回True。

has_previous():判斷是否還有上一頁,有的話返回 True。

has_other_pages():判斷是否上一頁或下一頁,有的話返回True。

next_page_number(): 返回下一頁的頁碼。如果下一頁不存在,拋出InvalidPage 異常。

previous_page_number():返回上一頁的頁碼。如果上一頁不存在,拋出InvalidPage 異常。

3 運用

下面是自己編寫的 demo 程序,介紹 Paginator 和 Page 如何一起使用。

3.1 視圖

在 views.py 獲取需要展示的全部數(shù)據,然后使用 Paginator 類對數(shù)據進行分頁,最后返回第 1 頁面的 page 對象。page 對象的作用巨大,一方面展示當前分頁數(shù)據,還提供獲取后續(xù)頁面數(shù)據的接口。

from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage, InvalidPage
from django.http import HttpResponse
from django.shortcuts import render
def paginator_view(request):
    book_list = []
    '''
    數(shù)據通常是從 models 中獲取。這里為了方便,直接使用生成器來獲取數(shù)據。
    '''
    for x in range(1, 26):  # 一共 25 本書
        book_list.append('Book ' + str(x))
    # 將數(shù)據按照規(guī)定每頁顯示 10 條, 進行分割
    paginator = Paginator(book_list, 10)
    if request.method == "GET":
        # 獲取 url 后面的 page 參數(shù)的值, 首頁不顯示 page 參數(shù), 默認值是 1
        page = request.GET.get('page')
        try:
            books = paginator.page(page)
        # todo: 注意捕獲異常
        except PageNotAnInteger:
            # 如果請求的頁數(shù)不是整數(shù), 返回第一頁。
            books = paginator.page(1)
        except InvalidPage:
            # 如果請求的頁數(shù)不存在, 重定向頁面
            return HttpResponse('找不到頁面的內容')
        except EmptyPage:
            # 如果請求的頁數(shù)不在合法的頁數(shù)范圍內,返回結果的最后一頁。
            books = paginator.page(paginator.num_pages)
    template_view = 'page.html'
    return render(request, template_view, {'books': books})

3.2 模板

模板的工作就是在 HTML 頁面中填充數(shù)據。當拿到視圖傳遞過來的 books(books 是一個 Page 對象), 就在 for 循環(huán)中打印數(shù)據。最后使用 books 根據頁面情況展示上一頁按鈕,當前頁數(shù),總頁數(shù),下一頁按鈕。

{% load staticfiles %}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/html">
<head>
    <meta charset="UTF-8">
    <link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet">
    <script src="{% static 'js/jquery.min.js' %}"></script>
    <script src="{% static 'js/bootstrap.min.js' %}"></script>
    <title>分頁</title>
</head>
<br>
    <div >
        {% for book in books %}
            <span>書名: {{ book }} <br /></span>
        {% endfor %}
    </div>
    {# 實現(xiàn)分頁標簽的代碼 #}
    {# 這里使用 bootstrap 渲染頁面 #}
    <div id="pages" >
        <nav>
            <ul>
                <li>
                {% if books.has_previous %}
                    <a href="?page={{ books.previous_page_number }}">上一頁</a>
                {% endif %}
                <span>
                    Page {{ books.number }} of {{ books.paginator.num_pages }}</span>
                {% if books.has_next %}
                    <a href="?page={{ books.next_page_number }}">下一頁</a>
                {% endif %}
                </li></ul></nav></div>
</body>
</html>

3.3 運行結果

我在 urls.py 中配置當前的 app 訪問路徑是 paginator/。所以使用瀏覽器訪問地址 http://127.0.0.1:8000/paginator/, 看到訪問結果如下:

Django實現(xiàn)分頁功能的方法

Django實現(xiàn)分頁功能的方法

Django實現(xiàn)分頁功能的方法

以上是Django實現(xiàn)分頁功能的方法的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI