Diango博客--16.穩定易用的 Django 分頁庫,完善分頁功能(二)

文章目錄

    • 0.思路引導
    • 1.分頁效果概述
    • 2.分頁思路
    • 3.Django 第三方拓展:django-pure-pagination
    • 4.自定義模板

0.思路引導

1)在前面我們通過 Django Pagination 實現簡單分頁 中,我們實現了一個簡單的分頁導航。但效果有點差強人意,我們只能點上一頁和下一頁的按鈕進行翻頁。

2)比較完善的分頁效果應該像下面這樣,但想實現這樣一種效果,Django Pagination 內置的 API 已無能為力。

3)接下來我們將通過拓展 Django Pagination 來實現下圖這樣比較完善的分頁效果。
在這里插入圖片描述

1.分頁效果概述

一個比較完善的分頁效果應該具有以下特性:

  • 始終顯示第一頁和最后一頁。
  • 當前頁碼高亮顯示。
  • 顯示當前頁碼前后幾個連續的頁碼。
  • 如果兩個頁碼號間還有其它頁碼,中間顯示省略號以提示用戶。

2.分頁思路

如果需要自己來實現分頁效果,我們會怎么做呢?先來分析一下導航條的組成部分,可以看到整個分頁導航條其實可以分成 7 個部分:

  • 第 1 頁頁碼,這一頁需要始終顯示。
  • 第 1 頁頁碼后面的省略號部分。但要注意如果第 1 頁的頁碼號后面緊跟著頁碼號 2,那么省略號就不應該顯示。
  • 當前頁碼的左邊部分,比如這里的 3-4。
  • 當前頁碼,比如這里的 5。
  • 當前頁碼的右邊部分,比如這里的 6-7。
  • 最后一頁頁碼前面的省略號部分。但要注意如果最后一頁的頁碼號前面跟著的頁碼號是連續的,那么省略號就不應該顯示。
  • 最后一頁的頁碼號。

因此我們的思路是,在視圖中依據上述規則生成頁碼列表,然后在模板中循環顯示頁碼列表就可以了。

有了思路,實現起來其實也并不很難。不過對于這類常見需求,別人早就幫我們實現好了,本著不重復造輪子的原則,直接拿來用就好。

3.Django 第三方拓展:django-pure-pagination

我們第一次開始接觸 django 第三方拓展,在此之前我們一直都基于 django 本身我們提供的功能在開發,然而 django 強大的地方就在于海量的第三方應用供我們挑選,幾乎大部分 web 開發中的需求,django 都能找到他人已經寫好的第三方應用,拿來即用。

事實上,正確的 django 開發姿勢應該是這樣的:

  • 充分理解你的需求,想一想,如果自己實現,我會怎么做?
  • 通過 Google、GitHub、開發者社區論壇等調研已有的實現類似需求的應用
  • 拿來即用,并嘗試理解他人是如何實現這個功能的

首先我們上面分析了分頁需求的實現。然后我在 GitHub 上通過 django pagination 關鍵詞進行搜索,在比較了多個 star 數比較高的項目后,發現 django-pure-pagination 文檔最清晰,使用最簡單,因此決定將這個應用集成到我們的博客來。值得一提的是,盡管這個應用顯示作者最后一次更新代碼在 4 年前,但我粗略瀏覽了一下源碼,發現其依賴的 django api 4 年來異常穩定,所以確保能在 django 2.2 中使用。

具體的源代碼請戳這里,根據教程,做以下擴展:

1)首先安裝它:

$ pipenv install django-pure-pagination

2)然后將它注冊到 INSTALLED_APPS 里:

INSTALLED_APPS = [# ...'pure_pagination',  # 分頁'blog.apps.BlogConfig',  # 注冊 blog 應用'comments.apps.CommentsConfig',  # 注冊 comments 應用
]

3)修改 IndexView,讓它繼承 django-pure-pagination 提供的 PaginationMixin,這個混入類將為我們提供上述提到的分頁功能。

class IndexView(PaginationMixin, ListView):model = Posttemplate_name = 'blog/index.html'context_object_name = 'post_list'paginate_by = 10

4)然后在 common.py 配置中配置一下分頁的效果,這是 django-pure-pagination 提供的配置項,用于個性化配置分頁效果:

# django-pure-pagination 分頁設置
PAGINATION_SETTINGS = {'PAGE_RANGE_DISPLAYED': 4, # 分頁條當前頁前后應該顯示的總頁數(兩邊均勻分布,因此要設置為偶數),'MARGIN_PAGES_DISPLAYED': 2, # 分頁條開頭和結尾顯示的頁數'SHOW_FIRST_PAGE_WHEN_INVALID': True, # 當請求了不存在頁,顯示第一頁
}

5)在模板中需要分頁的地方,調用分頁對象的 render 方法就可以了,比如在 index.html 中:

{% if is_paginated %}{{ page_obj.render }}
{% endif %}

注意這里 page_obj 是分頁后的對象列表,具體請參考上一篇文章的講解。render 方法會自動幫我們渲染一個預先定義好的分頁條,至此,分頁功能就完成了。效果顯示如下:
在這里插入圖片描述

4.自定義模板

上邊可以看出,有時候預定義的分頁條并不能滿足我們的需求,因此我們需要通過自定義的模板來覆蓋預定義的模板。

django 查找模板的順序是,首先在項目配置的模板根路徑尋找(我們項目中配的是 templates 文件夾),沒有找到的話,再去應用的 templates 目錄下尋找。

分頁模板預定義的路徑為 pure_pagination/pagination.html,所以我們可以在項目模板根路徑下建立一個一模一樣的文件結構,這樣 django 就會首先找到我們的模板,從而應用我們自定義的模板,而不是預定義的模板。

在 templates 目錄下新建一個 pure_pagination\ 目錄,然后建立一個 pagination.html 文件。

接下來便是在模板中設置分頁導航了,將導航條的七個部分的數據一一展現即可,示例代碼如下:

<div class="text-center pagination" style="width: 100%"><ul>{% if page_obj.has_previous %}<li><a href="?{{ page_obj.previous_page_number.querystring }}"class="prev">&lsaquo;&lsaquo; </a></li>{% else %}<li><span class="disabled prev">&lsaquo;&lsaquo; </span></li>{% endif %}{% for page in page_obj.pages %}{% if page %}{% ifequal page page_obj.number %}<li class="current"><a href="#">{{ page }}</a></li>{% else %}<li><a href="?{{ page.querystring }}" class="page">{{ page }}</a></li>{% endifequal %}{% else %}...{% endif %}{% endfor %}{% if page_obj.has_next %}<li><a href="?{{ page_obj.next_page_number.querystring }}" class="next"> &rsaquo;&rsaquo;</a></li>{% else %}<li><span class="disabled next"> &rsaquo;&rsaquo;</span></li>{% endif %}</ul>
</div>

效果顯示如下:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452393.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452393.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452393.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

回歸測試

在集成測試過程中&#xff0c;每當一個新模塊結合進來時&#xff0c;程序就發生了變化&#xff1a;建立了新的數據流路徑&#xff0c;可能出現了新的I/O操作&#xff0c;激活了新的控制邏輯。在集成測試的范疇中&#xff0c;回歸測試是指重新執行已經做過的測試的某個子集&…

不同的寫法 其中 1 2 (試了下 沒有效果 ,先記載這里把)

轉載于:https://www.cnblogs.com/kaibindirver/p/9145455.html

美國西北大學 計算機工程專業排名,[轉載]美國西北大學計算機工程研究生最新專業排名...

對于打算去美國西北大學讀研究生的學生來講&#xff0c;美國西北大學研究生申請要求及美國西北大學研究生專業介紹是學生最關心的問題。本文香港介紹美國西北大學研究生申請要求及美國西北大學研究生的專業介紹&#xff0c;幫助更多的學生更好的了解美國西北大學。2016年西北大…

析構函數virtual與非virtual區別

作為通常的原則&#xff0c;如果一個類定義了虛函數&#xff0c;那么它的析構函數就應當是virtual的。因為定義了虛函數則隱含著&#xff1a;這個類會被繼承&#xff0c;并且會通過基類的指針指向子類對象&#xff0c;從而得到多態性。 這個類可能會被繼承&#xff0c;并且會…

Python:字典列表字符串方法測試

測試的一些Python中的關于字典、列表、字符串的使用方法&#xff0c;放在這里備查。整個測試代碼和說明如下&#xff1a; # -*- coding: utf-8 -*- """Python:函數中全是指針傳遞&#xff0c;而任何變量都是給予一個指針指向一個內存空間"""impo…

什么是確認測試

確認測試也稱為驗收測試&#xff0c;它的目標是驗證軟件的有效性。 通常&#xff0c;驗證指的是保證軟件正確地實現了某個特定要求的一系列活動&#xff1b;確認指的是為了保證軟件確實滿足了用戶需求而進行的一系列活動。 軟件有效性的一個簡單定義是&#xff1a;如果軟件的功…

Diango博客--17.統計各個分類和標簽下的文章數

文章目錄0.思路引導1.Model 回顧2.數據庫數據聚合3.使用 Annotate4.在模板中引用新增的屬性0.思路引導 在我們的博客側邊欄有分類列表和標簽列表&#xff0c;顯示博客已有的全部文章分類。現在想在分類名和標簽名后顯示該分類或者標簽下有多少篇文章&#xff0c;該怎么做呢&am…

HTTP協議中request報文請求方法和狀態響應碼

一個HTTP請求報文由4部分組成&#xff1a; 請求行&#xff08;request line&#xff09;請求頭部&#xff08;header&#xff09;空行請求數據下圖給出了請求報文的一般格式&#xff1a; 請求行中包括了請求方法&#xff0c;常見的請求方法有&#xff1a; GET&#xff1a;從服務…

計算機無法安裝64位操作系統,為什么我的win7旗艦版service Pack 1 64位操作系統 無法安裝(KB2670838) 這個更新...

您好&#xff01;我了解到您遇到關于這邊的問題請問無法安裝是否出現了什么錯誤代碼提示呢&#xff1f;請參考以下的步驟解決按WindowsR打開cmd里使用下面的命令關閉相關的一些服務&#xff1a;net stop wuauservnet stop cryptSvcnet stop bitsnet stop msiserver完成后&#…

bmon:一個強大的網絡帶寬監視和調試工具

bmon 是類 Unix 系統中一個基于文本&#xff0c;簡單但非常強大的 網絡監視和調試工具&#xff0c;它能抓取網絡相關統計信息并把它們以用戶友好的格式展現出來。它是一個可靠高效的帶寬監視和網速估測工具。 它能使用各種輸入模塊讀取輸入&#xff0c;并以各種輸出模式顯示輸出…

函數的調用規則(__cdecl,__stdcall,__fastcall,__pascal)

關于函數的調用規則&#xff08;調用約定&#xff09;&#xff0c;大多數時候是不需要了解的&#xff0c;但是如果需要跨語言的編程&#xff0c;比如VC寫的dll要delphi調用&#xff0c;則需要了解。 microsoft的vc默認的是__cdecl方式&#xff0c;而windows API則是__stdcall&a…

Linux 下的/usr/bin /usr/sbin /usr/local/bin /usr/local/sbin區別

1、/bin 是所有用戶都可以訪問并執行的可執行程序。包括超級用戶及一般用戶。 供所有用戶&#xff08;包括root用戶和一般用戶&#xff09;使用的基本命令&#xff0c;主要有cat,chmod,date,cp,bash等等常用的命令。 2、/usr/bin&#xff1a;系統預裝的可執行程序&#xff0c;…

alpha測試和betal測試

如果一個軟件是為許多客戶開發的&#xff08;例如&#xff0c;向大眾公開出售的盒裝軟件產品&#xff09;&#xff0c;那么絕大多數軟件開發商都使用被稱為Alpha測試和Beta測試的過程&#xff0c;來發現那些看起來只有最終用戶才能發現的錯誤。 Alpha測試由用戶在開發者的場所進…

計算機d盤無法格式化,四種方法解決D盤無法格式化問題

不少朋友系統出現故障&#xff0c;幾乎都是選擇重裝系統的方法來解決問題。系統重裝后&#xff0c;不少朋友覺得D盤沒有什么重要的東西&#xff0c;就想將其格式化&#xff0c;可是系統出現windows無法格式該驅動器的提示&#xff0c;這是怎么回事呢&#xff1f;D盤無法格式化要…

sqlserver視圖

作用 ①簡化了操作&#xff0c;把經常使用的數據定義為視圖。 ②安全性&#xff0c;用戶只能查詢和修改能看到的數據。 ③邏輯上的獨立性&#xff0c;屏蔽了真實表的結構帶來的影響。 對視圖的修改&#xff1a;單表視圖一般用于查詢和修改&#xff0c;會改變基本表的數據&#…

非root用戶sudo_ssh免密鑰

非root用戶sudo_ssh免密鑰 目標&#xff1a;從服務器上ssh登陸后sudo免密鑰執行相應的命令 環境介紹&#xff1a; 192.168.65.128 my1-222 192.168.65.129 my2-223 192.168.65.130 web224# 步驟一&#xff1a; # 每個節點執行(不是必須&#xff0c;但是建議這樣做) cat …

復旦大學和吉大計算機考研選哪個,2016復旦大學VS吉林大學 基于排名角度的比較?...

復旦大學好還是吉林大學好首先&#xff0c;2016復旦大學好還是吉林大學好是近日問得較多的問題之一&#xff0c;小伙伴們有的從吉林大學和復旦大學的地理位置優勢角度進行分析&#xff0c;有的從吉林大學和復旦大學的強勢專業角度進行PK&#xff0c;有的甚至從吉林大學和復旦大…

Diango博客--18.使用 Fabric 自動化部署 Django 項目

文章目錄1.本地安裝 Fabric2.部署過程回顧3.完善項目配置4.修改 BASE_DIR 配置項5.設置 Supervisor 環境變量6.編寫 Fabric 腳本7.執行 Fabric 自動部署腳本1.本地安裝 Fabric $ pipenv install fabric --dev 報錯&#xff1a; An error occurred while installing django-pure…

白盒測試詳解

通常把測試數據和預期的輸出結果稱為測試用例。 &#xff08;一&#xff09;邏輯覆蓋 是對一系列測試過程的總稱&#xff0c;這組測試過程逐漸進行越來越完整的通路測試。 1.語句覆蓋 語句覆蓋的含義是&#xff0c;選擇足夠多的測試數據&#xff0c;使被測程序中每個語句至少…

git 的安裝以及使用:是一個開源的分布式版本控制系統,可以對項目進行版本管理。 早期是linux之父用來管理linux系統源代碼的(linux是和windows一樣操作系統 開源免費的操作...

## 總結 - 學會使用基本的git命令 管理源代碼- 學會去github創建倉庫 并將代碼上傳到github的倉庫 (有待完成 回家有網再push)- 了解本地的.git和服務器github的.git的關系 是兩個倉庫 一個是本地 一個是服務器 需要使用一句命令來關聯 git remote add origin 遠端的.git的地址…