您好,登錄后才能下訂單哦!
這篇文章主要介紹Django實現(xiàn)分頁功能的方法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
當頁面因需要展示的數(shù)據條目過多,導致無法在一個頁面全部顯示。這時,頁面經常會采用分頁形式進行展示,然后每頁顯示 20 或者 50 等條數(shù)據。分頁經常在網站上隨處可見,它大概是這樣子:
這樣的實現(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)分頁功能的方法的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。