摘要:隨著時間的推移加上勤奮的寫作,你的博客文章一定會越來越多。如果不進行處理,可能同一個頁面會擠上成百上千的文章,不美觀不說,還降低了頁面的反應速度。這個時候就需要對文章進行分頁的處理。有疑問請在杜賽的個人網站留言,我會盡快回復。
隨著時間的推移(加上勤奮的寫作!),你的博客文章一定會越來越多。如果不進行處理,可能同一個頁面會擠上成百上千的文章,不美觀不說,還降低了頁面的反應速度。
這個時候就需要對文章進行分頁的處理。
利用輪子寫一個完善的分頁功能是有些難度的,好在Django已經幫你準備好一個現成的分頁模塊了(Django把大部分基礎功能都替你準備好了!)。內置模塊雖然簡單,但是對博客來說完全足夠了。
我們要用到的是Paginator類。在Shell中可以充分嘗試它的用法:
>>> from django.core.paginator import Paginator >>> objects = ["john", "paul", "george", "ringo"] >>> p = Paginator(objects, 2) >>> p.count 4 >>> p.num_pages 2 >>> p.page_range range(1, 3) >>> page1 = p.page(1) >>> page1>>> page1.object_list ["john", "paul"] >>> page2 = p.page(2) >>> page2.object_list ["george", "ringo"] >>> page2.has_next() False >>> page2.has_previous() True >>> page2.has_other_pages() True >>> page2.previous_page_number() 1
這是一個官網的例子。詳見:Pagination
有了這個類,剩下的工作就是把它應用到項目中去。
輕車熟路要對文章列表分頁,因此就要修改article/views.py的def article_list()視圖:
article/views.py ... # 引入分頁模塊 from django.core.paginator import Paginator def article_list(request): # 修改變量名稱(articles -> article_list) article_list = ArticlePost.objects.all() # 每頁顯示 1 篇文章 paginator = Paginator(article_list, 1) # 獲取 url 中的頁碼 page = request.GET.get("page") # 將導航對象相應的頁碼內容返回給 articles articles = paginator.get_page(page) context = { "articles": articles } return render(request, "article/list.html", context) ...
在視圖中通過Paginator類,給傳遞給模板的內容做了手腳:返回的不再是所有文章的集合,而是對應頁碼的部分文章的對象,并且這個對象還包含了分頁的方法。
我們在前面的文章已經接觸過一些將參數傳遞到視圖的手段了:
通過POST請求將表單數據傳遞到視圖
通過url將地址中的參數傳遞到視圖
這里用到了另一種方法:在GET請求中,在url的末尾附上?key=value的鍵值對,視圖中就可以通過request.GET.get("key")來查詢value的值。
然后改寫模板,在最末尾的
templates/article/list.html ......{% if articles.has_previous %} « 1 ... {{ articles.previous_page_number }} {% endif %} {{ articles.number }} {% if articles.has_next %} {{ articles.next_page_number }} ... {{ articles.paginator.num_pages }} » {% endif %}
內容也比較簡單,用到了前面的Shell中演示的部分方法,判斷當前頁所處的位置。
這樣就行了!補充幾篇文章(筆者共6篇),方便測試。刷新頁面后是這樣的:
視圖中設置了每頁只有1篇文章,所以就真的只有1篇了。
當然這只是為了測試,實際環境中肯定要遠大于1篇的。
點擊第2頁的按鈕后是這樣的:
看到頂部地址欄中的變化了嗎?
思考一下page是如何從模板傳遞到視圖的。
總結除模板外,我們只寫了4行代碼,就有了還不錯的分頁導航,Django就是這么貼心。
除了對文章列表,你可以對任何你想分頁的地方運用此模塊(比如以后要講到的評論),滿足用戶各類的需求。
讀者還可以稍加閱讀Bootstrap 4官方文檔,改寫一個符合自己品味的外觀。
有疑問請在杜賽的個人網站留言,我會盡快回復。
或Email私信我:dusaiphoto@foxmail.com
項目完整代碼:Django_blog_tutorial
轉載請并注明出處。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42834.html
摘要:有了瀏覽量之后,文章受歡迎的程度就有了評價標準。隨之而來的就有根據瀏覽量對文章進行排序的需求,即顯示最熱文章。它也是可以傳遞多個參數的,如,參數間用隔開視圖根據參數的值,判斷取出的文章如何排序方法指定對象如何進行排序。 有了瀏覽量之后,文章受歡迎的程度就有了評價標準。隨之而來的就有根據瀏覽量對文章進行排序的需求,即顯示最熱文章。 現在你已經很熟悉MTV模式,不需要我啰嗦也能完成任務: ...
摘要:本教程內容已過時,更新版教程請訪問博客開發入門教程。當分頁較多時,總是顯示當前頁及其前幾頁和后幾頁的頁碼教程中使用的是兩頁,其他頁碼用省略號代替。 本教程內容已過時,更新版教程請訪問: django 博客開發入門教程。 摘要:前兩期教程我們實現了博客的 Model 部分,以及 Blog 的首頁視圖 IndexView,詳情頁面 DetailView,以及分類頁面 CategoryVi...
摘要:創建在中的一個代表一個功能模塊。就是項目的基石,因此開發博客的第一步就是創建新的,用來實現跟文章相關的功能模塊。注意之后,的必須配置,否則會報錯。總結本章創建了博客文章功能的,學習了注冊并配置。 創建APP 在Django中的一個app代表一個功能模塊。開發者可以將不同功能的模塊放在不同的app中, 方便代碼的復用。app就是項目的基石,因此開發博客的第一步就是創建新的app,用來實現...
摘要:在里寫一個數據庫驅動的應用的第一步是定義模型,也就是數據庫結構設計和附加的其它元數據。模型元數據是任何不是字段的東西,例如排序選項數據庫表名單數和復數名稱和。 Django 框架主要關注的是模型(Model)、模板(Template)和視圖(Views),稱為MTV模式。 它們各自的職責如下: 層次 職責 模型(Model),即數據存取層 處理與數據相關的所有事務: 如何存取...
摘要:教程看到這里,你已經學會如下內容搭建開發環境博文管理用戶管理發表評論若干小功能搭建簡單的小博客,以上的功能夠用了。教程為了起步平緩,沒有展開這方面的內容。陌生人,祝你學業進步事業有成歡迎常到杜賽的個人網站做客 教程看到這里,你已經學會如下內容: 搭建開發環境 博文管理 用戶管理 發表評論 若干小功能 搭建簡單的小博客,以上的功能夠用了。 相信你的志向不止于此。畢竟程序員面試個個造火...
閱讀 2905·2021-11-24 09:39
閱讀 1163·2021-11-02 14:38
閱讀 4156·2021-09-10 11:26
閱讀 2748·2021-08-25 09:40
閱讀 2310·2019-08-30 15:54
閱讀 482·2019-08-30 10:56
閱讀 2744·2019-08-26 12:14
閱讀 3216·2019-08-26 12:13