日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Diango博客--16.稳定易用的 Django 分页库,完善分页功能(二)

發(fā)布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Diango博客--16.稳定易用的 Django 分页库,完善分页功能(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

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

0.思路引導(dǎo)

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

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

3)接下來我們將通過拓展 Django Pagination 來實現(xiàn)下圖這樣比較完善的分頁效果。

1.分頁效果概述

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

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

2.分頁思路

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

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

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

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

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

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

事實上,正確的 django 開發(fā)姿勢應(yīng)該是這樣的:

  • 充分理解你的需求,想一想,如果自己實現(xiàn),我會怎么做?
  • 通過 Google、GitHub、開發(fā)者社區(qū)論壇等調(diào)研已有的實現(xiàn)類似需求的應(yīng)用
  • 拿來即用,并嘗試?yán)斫馑耸侨绾螌崿F(xiàn)這個功能的

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

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

1)首先安裝它:

$ pipenv install django-pure-pagination

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

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

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 分頁設(shè)置 PAGINATION_SETTINGS = {'PAGE_RANGE_DISPLAYED': 4, # 分頁條當(dāng)前頁前后應(yīng)該顯示的總頁數(shù)(兩邊均勻分布,因此要設(shè)置為偶數(shù)),'MARGIN_PAGES_DISPLAYED': 2, # 分頁條開頭和結(jié)尾顯示的頁數(shù)'SHOW_FIRST_PAGE_WHEN_INVALID': True, # 當(dāng)請求了不存在頁,顯示第一頁 }

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

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

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

4.自定義模板

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

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

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

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

接下來便是在模板中設(shè)置分頁導(dǎo)航了,將導(dǎo)航條的七個部分的數(shù)據(jù)一一展現(xiàn)即可,示例代碼如下:

<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>

效果顯示如下:

總結(jié)

以上是生活随笔為你收集整理的Diango博客--16.稳定易用的 Django 分页库,完善分页功能(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。