這篇文章主要介紹Django實(shí)現(xiàn)分頁功能的方法,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
站在用戶的角度思考問題,與客戶深入溝通,找到巍山網(wǎng)站設(shè)計(jì)與巍山網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、虛擬主機(jī)、企業(yè)郵箱。業(yè)務(wù)覆蓋巍山地區(qū)。
當(dāng)頁面因需要展示的數(shù)據(jù)條目過多,導(dǎo)致無法在一個(gè)頁面全部顯示。這時(shí),頁面經(jīng)常會(huì)采用分頁形式進(jìn)行展示,然后每頁顯示 20 或者 50 等條數(shù)據(jù)。分頁經(jīng)常在網(wǎng)站上隨處可見,它大概是這樣子:
這樣的實(shí)現(xiàn)不僅提高了用戶體驗(yàn),還是減輕數(shù)據(jù)庫讀取數(shù)據(jù)的壓力。Django 自帶名為 Paginator 的分頁工具, 方便我們實(shí)現(xiàn)分頁功能。本文就講解如何使用 Paginator 實(shí)現(xiàn)分頁功能。
1 Paginator
Paginator 類的作用是將我們需要分頁的數(shù)據(jù)分割成若干份。當(dāng)我們實(shí)現(xiàn)化一個(gè) Paginator 類的實(shí)例時(shí),需要給 Paginator 傳入兩個(gè)參數(shù)。第一個(gè)參數(shù)是數(shù)據(jù)源,可以是一個(gè)列表、元組、以及查詢結(jié)果集 QuerySet。第二個(gè)參數(shù)需要傳入一個(gè)整數(shù),表示每頁顯示數(shù)據(jù)條數(shù)。具體寫法如下:
book_list = []
for x in range(1, 26): # 一共 25 本書
book_list.append('Book ' + str(x))
# 將數(shù)據(jù)按照規(guī)定每頁顯示 10 條, 進(jìn)行分割
paginator = Paginator(book_list, 10)
上面代碼中,我們傳入一個(gè)名為 book_list 的列表,該列表中含有 25 本書,然后我們給 Paginator 設(shè)定每頁顯示 10 條數(shù)據(jù),最后得到一個(gè) Paginator 實(shí)例。
另外 Paginator 類中有三個(gè)常用的屬性,它們分別是:
count:表示所有頁面的對(duì)象總數(shù)。
num_pages: 表示頁面總數(shù)。
page_range: 下標(biāo)從 1 開始的頁數(shù)范圍迭代器。
2 Page 對(duì)象
Paginator 類提供一個(gè)** page(number) **函數(shù),該函數(shù)返回就是一個(gè) Page 對(duì)象。參數(shù) number 表示第幾個(gè)分頁。如果 number = 1,那么 page() 返回的對(duì)象是第一分頁的 Page 對(duì)象。在前端頁面中顯示數(shù)據(jù),我們主要的操作都是基于 Page 對(duì)象。具體用法如下:
# 使用 paginator 對(duì)象返回第 1 頁的 page 對(duì)象
books = paginator.page(1)
Page 對(duì)象有三個(gè)常用的屬性:
object_list: 表示當(dāng)前頁面上所有對(duì)象的列表。
numberv: 表示當(dāng)前頁的序號(hào),從 1 開始計(jì)數(shù)。
paginator: 當(dāng)前 Page 對(duì)象所屬的 Paginator 對(duì)象。
除此之外,Page 對(duì)象還擁有幾個(gè)常用的函數(shù):
has_next(): 判斷是否還有下一頁,有的話返回True。
has_previous():判斷是否還有上一頁,有的話返回 True。
has_other_pages():判斷是否上一頁或下一頁,有的話返回True。
next_page_number(): 返回下一頁的頁碼。如果下一頁不存在,拋出InvalidPage 異常。
previous_page_number():返回上一頁的頁碼。如果上一頁不存在,拋出InvalidPage 異常。
3 運(yùn)用
下面是自己編寫的 demo 程序,介紹 Paginator 和 Page 如何一起使用。
3.1 視圖
在 views.py 獲取需要展示的全部數(shù)據(jù),然后使用 Paginator 類對(duì)數(shù)據(jù)進(jìn)行分頁,最后返回第 1 頁面的 page 對(duì)象。page 對(duì)象的作用巨大,一方面展示當(dāng)前分頁數(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 條, 進(jìn)行分割 paginator = Paginator(book_list, 10) if request.method == "GET": # 獲取 url 后面的 page 參數(shù)的值, 首頁不顯示 page 參數(shù), 默認(rèn)值是 1 page = request.GET.get('page') try: books = paginator.page(page) # todo: 注意捕獲異常 except PageNotAnInteger: # 如果請(qǐng)求的頁數(shù)不是整數(shù), 返回第一頁。 books = paginator.page(1) except InvalidPage: # 如果請(qǐng)求的頁數(shù)不存在, 重定向頁面 return HttpResponse('找不到頁面的內(nèi)容') except EmptyPage: # 如果請(qǐng)求的頁數(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ù)。當(dāng)拿到視圖傳遞過來的 books(books 是一個(gè) Page 對(duì)象), 就在 for 循環(huán)中打印數(shù)據(jù)。最后使用 books 根據(jù)頁面情況展示上一頁按鈕,當(dāng)前頁數(shù),總頁數(shù),下一頁按鈕。
{% load staticfiles %}分頁
{% for book in books %} 書名: {{ book }}{# 實(shí)現(xiàn)分頁標(biāo)簽的代碼 #} {# 這里使用 bootstrap 渲染頁面 #}
{% endfor %}