十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務(wù)器提供商,新人活動買多久送多久,劃算不套路!
這篇文章主要介紹Django實現(xiàn)分頁功能的方法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
當頁面因需要展示的數(shù)據(jù)條目過多,導(dǎo)致無法在一個頁面全部顯示。這時,頁面經(jīng)常會采用分頁形式進行展示,然后每頁顯示 20 或者 50 等條數(shù)據(jù)。分頁經(jīng)常在網(wǎng)站上隨處可見,它大概是這樣子:
這樣的實現(xiàn)不僅提高了用戶體驗,還是減輕數(shù)據(jù)庫讀取數(shù)據(jù)的壓力。Django 自帶名為 Paginator 的分頁工具, 方便我們實現(xiàn)分頁功能。本文就講解如何使用 Paginator 實現(xiàn)分頁功能。
1 Paginator
Paginator 類的作用是將我們需要分頁的數(shù)據(jù)分割成若干份。當我們實現(xiàn)化一個 Paginator 類的實例時,需要給 Paginator 傳入兩個參數(shù)。第一個參數(shù)是數(shù)據(jù)源,可以是一個列表、元組、以及查詢結(jié)果集 QuerySet。第二個參數(shù)需要傳入一個整數(shù),表示每頁顯示數(shù)據(jù)條數(shù)。具體寫法如下:
book_list = []
for x in range(1, 26): # 一共 25 本書
book_list.append('Book ' + str(x))
# 將數(shù)據(jù)按照規(guī)定每頁顯示 10 條, 進行分割
paginator = Paginator(book_list, 10)
上面代碼中,我們傳入一個名為 book_list 的列表,該列表中含有 25 本書,然后我們給 Paginator 設(shè)定每頁顯示 10 條數(shù)據(jù),最后得到一個 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ù)據(jù),我們主要的操作都是基于 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ù)據(jù),然后使用 Paginator 類對數(shù)據(jù)進行分頁,最后返回第 1 頁面的 page 對象。page 對象的作用巨大,一方面展示當前分頁數(shù)據(jù),還提供獲取后續(xù)頁面數(shù)據(jù)的接口。
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ù)據(jù)通常是從 models 中獲取。這里為了方便,直接使用生成器來獲取數(shù)據(jù)。 ''' for x in range(1, 26): # 一共 25 本書 book_list.append('Book ' + str(x)) # 將數(shù)據(jù)按照規(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('找不到頁面的內(nèi)容') except EmptyPage: # 如果請求的頁數(shù)不在合法的頁數(shù)范圍內(nèi),返回結(jié)果的最后一頁。 books = paginator.page(paginator.num_pages) template_view = 'page.html' return render(request, template_view, {'books': books})
3.2 模板
模板的工作就是在 HTML 頁面中填充數(shù)據(jù)。當拿到視圖傳遞過來的 books(books 是一個 Page 對象), 就在 for 循環(huán)中打印數(shù)據(jù)。最后使用 books 根據(jù)頁面情況展示上一頁按鈕,當前頁數(shù),總頁數(shù),下一頁按鈕。
{% load staticfiles %}分頁
{% for book in books %} 書名: {{ book }}{# 實現(xiàn)分頁標簽的代碼 #} {# 這里使用 bootstrap 渲染頁面 #}
{% endfor %}