Diango博客--9.歸檔、分類和標簽頁

文章目錄

    • 0.思路引導
    • 1.回顧
    • 2.歸檔頁面
    • 3.分類頁面
    • 4.標簽頁面

0.思路引導

側邊欄已經正確地顯示了最新文章列表、歸檔、分類、標簽等信息,現在來完善歸檔、分類和標簽功能。

當用戶點擊歸檔下的某個日期、分類欄目下的某個分類或者標簽欄目下的某個標簽時,跳轉到文章列表頁面,顯示該日期、分類或者標簽下的全部文章。
在這里插入圖片描述

1.回顧

首頁index.html繼承base.html,當首頁加載時,base.html中的模板標簽{% show_recent_post %}、 {% show_archieves %}、 {% show_categories %}、{% show_tages %},即在blog_extra.py中定義的模板標簽,從數據庫中獲取數據,

在這里插入圖片描述
在這里插入圖片描述同時對模板標簽中參數指向的模板進行渲染,返回首頁內容,展示給讀者。
在這里插入圖片描述
其中“最近文章”的跳轉地址通過get_post_url獲取,在上一篇文章中已經說明,本篇將對“歸檔”、“分類”、“標簽頁”進行點擊跳轉的相關操作。

2.歸檔頁面

1)首先,在 inclusions 文件夾下找到 archives 的模板,修改超鏈接的 href 屬性,讓用戶點擊超鏈接后跳轉到文章歸檔頁面:

文件位置:templates/blog/inclusions/_archives.html

...
{% for date in date_list %}
<li><a href="{% url 'blog:archive' date.year date.month %}">{{ date.year }}{{ date.month }}</a>
</li>
{% endfor %}
...

這里 {% url %} 這個模板標簽的作用是解析視圖函數 blog:archive 對應的 URL 模式,并把 URL 模式中的年和月替換成 date.year,date.month 的值。

{% url %} 模板標簽接收的第一個參數為被解析視圖函數的端點值,這個端點值由 2 部分組成,中間由冒號分隔。第一部分為在應用的 urls.py 中指定的 app_name 的值(充當命名空間,這樣即使不同 app 下有相同的視圖函數名,也不會沖突),第二部分 path 函數中傳入的 name 參數的值。比如在 blog 應用的 urls.py 模塊,我們指定了 app_name = ‘blog’,archive 視圖函數的 url 模式為 path(‘archives/int:year/int:month/’, views.archive, name=‘archive’),因此對應的端點值為 blog:archive。

{% url %} 模板標簽接收的其它參數為 URL 路徑參數,即 URL 模式中路徑參數轉換器需要捕獲的值。例如 archive 視圖函數對應的 URL 模式為 archives/int:year/int:month/,假設 date.year=2017,date.month=5,那么 {% url ‘blog:archive’ date.year date.month %} 模板標簽返回的值為 /archives/2017/5/。

為什么要使用 {% url %} 模板標簽呢?事實上,我們把超鏈接的 href 屬性設置為 /archives/{{ date.year }}/{{ date.month }}/ 同樣可以達到目的,但是這種寫法是硬編碼的。雖然現在 blog:archive 視圖函數對應的 URL 模式是這種形式,但是如果哪天這個模式改變了呢?如果使用了硬編碼的寫法,那你需要把每一處 /archives/{{ date.year }}/{{ date.month }}/ 修改為新的模式。但如果使用了 {% url %} 模板標簽,則不用做任何修改。

2)其次,對路由進行設置:

文件位置:blog/urls.py

from django.urls import pathfrom . import viewsapp_name = 'blog'
urlpatterns = [path('', views.index, name='index'),path('posts/<int:pk>/', views.detail, name='detail'),path('archives/<int:year>/<int:month>/', views.archive, name='archive'),
]

這個歸檔視圖對應的 URL 和 detail 視圖函數對應的 URL 是類似的.

django 會從用戶訪問的 URL 中自動提取 URL 路徑參數轉換器 type:name 規則捕獲的值,然后傳遞給其對應的視圖函數。

例如如果用戶想查看 2017 年 3 月下的全部文章,他訪問 /archives/2017/3/,那么 URL 轉換器就會根據規則捕獲到 2017 和 3 這兩個整數,然后作為參數傳給 archive 視圖函數, archive 視圖函數的實際調用為:archive(request, year=2017, month=3)。

3)編寫視圖函數:

文件位置:blog/views.py

from .models import Postdef archive(request, year, month):post_list = Post.objects.filter(created_time__year=year,created_time__month=month).order_by('-created_time')return render(request, 'blog/index.html', context={'post_list': post_list})

這里使用了模型管理器(objects)的 filter 方法來過濾文章。由于是按照日期歸檔,因此這里根據文章發表的年和月來過濾。具體來說,就是根據 created_time 的 year 和 month 屬性過濾,篩選出文章發表在對應的 year 年和 month 月的文章。

注意這里 created_time 是 Python 的 date 對象,其有一個 year 和 month 屬性,Python 中調用屬性的方式通常是 created_time.year,但是由于這里作為方法的參數列表,所以 django 要求我們把點替換成了兩個下劃線,即 created_time__year。

同時和 index 視圖中一樣,我們對返回的文章列表進行了排序。此外由于歸檔頁面和首頁展示文章的形式是一樣的,因此直接復用了 index.html 模板。

3.分類頁面

同樣的邏輯,接下來對分類頁面和標簽頁面進行補充。

文件位置:templates/blog/inclusions/_categories.html

...
{% for category in category_list %}
<li><a href="{% url 'blog:category' category.pk %}">{{ category.name }}</a>
</li>
{% endfor %}
...

文件位置:blog/urls.py

urlpatterns = [path('archives/<int:year>/<int:month>/', views.archive, name='archive'),path('categories/<int:pk>/', views.category, name='category'),
]

文件位置:blog/views.py


# 引入 Category 類
from .models import Post, Categorydef category(request, pk):# 記得在開始部分導入 Category 類cate = get_object_or_404(Category, pk=pk)post_list = Post.objects.filter(category=cate).order_by('-created_time')return render(request, 'blog/index.html', context={'post_list': post_list})

4.標簽頁面

文件位置:templates/blog/inclusions/_tags.html

...
{% for tag in tag_list %}<li><a href="{% url 'blog:tag' tag.pk %}">{{ tag.name }}</a></li>
{% empty %}暫無標簽!
{% endfor %}
...

文件位置:blog/urls.py

from django.urls import pathfrom . import viewsapp_name = 'blog'
urlpatterns = [...path('categories/<int:pk>/', views.category, name='category'),path('tags/<int:pk>/', views.tag, name='tag'),
]

文件位置:blog/views.py

from .models import Category, Post, Tagdef tag(request, pk):# 記得在開始部分導入 Tag 類t = get_object_or_404(Tag, pk=pk)post_list = Post.objects.filter(tags=t).order_by('-created_time')return render(request, 'blog/index.html', context={'post_list': post_list})

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

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

相關文章

android studio1.2.6,1.2.2 使用Android Studio開發Android APP | 菜鳥教程

寫在前面本節將介紹如何使用Android Studio開發Android APP&#xff0c;和前面Eclipse ADT SDK搭建Android開發環境一樣&#xff0c;本節也只是介紹一些基本東西&#xff0c;深入的&#xff0c;比如快捷鍵&#xff0c;小技巧等會再另一篇文章中詳細地介紹&#xff01;1.下載A…

軟件工程中的啟發規則

1.改進軟件結構提高模塊獨立性 2. 模塊規模應該適中 3.深度、寬度、扇出和扇入都應適當 4.模塊的作用域應該在控制域之內 5.力爭降低模塊接口的復雜程度 6.設計單入口單出口的模塊 7.模塊功能應該可以預測

C#指南,重溫基礎,展望遠方!(4)表達式

表達式是在操作數和運算符的基礎之上構造而成。 表達式的運算符指明了向操作數應用的運算。 運算符的示例包括 、-、*、/ 和 new。 操作數的示例包括文本、字段、局部變量和表達式。 如果表達式包含多個運算符&#xff0c;那么運算符的優先級決定了各個運算符的計算順序。 例如…

UPS開始嘗試“貨車+無人機”的投遞方式,不必再擔心快遞員離職了

繼亞馬遜“空中倉庫”&#xff0c;無人機送貨再現新形式。 作為世界上最大的快遞承運商與包裹遞送公司&#xff0c;UPS當然也沒有放過“送貨無人機”這一新穎業務。與亞馬遜推出“空中倉庫”的理念類似&#xff0c;UPS并沒有選擇讓無人機從倉庫直接起飛&#xff0c;而是將之與…

技術人員如何"正確"的浪費時間?

蘋果產品用戶要浪費時間&#xff0c;你就應該這樣做&#xff1a;買個有鎖的 iPhone &#xff0c;每天刷幾百次威鋒網等待越獄或解鎖&#xff0c;看到新 App 就安裝&#xff0c;程序提示更新立刻升級&#xff1b;有新的固件(哪怕是 β 版)就壓制不住升級的欲望&#xff1b;每次 …

Diango博客--10.交流的橋梁“評論功能”

文章目錄0.思路引導1.創建"評論"應用2.設計"評論"的數據庫模型3.注冊"評論"模型到 admin4.設計“評論”表單5.展示評論表單6.“評論”視圖函數7.綁定 URL8.向讀者發送是否“評論”成功的狀態9.詳情頁底部顯示“評論”內容0.思路引導 本文將創建…

python與android交互,Android客戶端與Python服務器端的簡單通信

最近在做一個APP&#xff0c;需要與服務器通信&#xff0c;一點一點的嘗試&#xff0c;記錄一下。本文使用了OkHttp和Flask框架。Android客戶端&#xff1a;實現功能輸入完點擊OK按鈕后會toast成功的信息。Python服務端&#xff1a;各部分代碼如下&#xff1a;activity_main.xm…

結構程序設計

結構程序設計經典定義&#xff1a;如果一個程序的代碼塊僅僅通過順序、選擇和循環這3種基本控制結構進行連接&#xff0c;并且每個代碼塊只有一個入口和一個出口&#xff0c;則稱這個程序是結構化的。 結構程序設計更全面的定義&#xff1a;結構程序設計是盡可能少用GO TO語句…

Sql Server 開窗函數Over()的使用

利用over()&#xff0c;將統計信息計算出來&#xff0c;然后直接篩選結果集1 declare t table(2 ProductID int,3 ProductName varchar(20),4 ProductType varchar(20),5 Price int)6 7 insert t8 select 1,name1,P1,3 union all9 select 2,name2,P1,5 union all 10 select 3,…

云棲科技評論第48期:前沿科技對世界的改造 我們這代人只完成了1%

1、數字經濟版圖呈中美雙分趨勢 日本IT行業為前景擔憂 數字經濟版圖呈中美雙分趨勢 日本IT行業為前景擔憂 【新聞摘要】《日本經濟新聞》日前刊文稱&#xff0c;數字經濟的勢力版圖呈現中國和美國兩強雙分的趨勢明顯&#xff0c;這意味著日本可能不得不使用中美的技術&#xff…

程序員犯的非技術錯誤(Top 5)

對于程序開發者來說&#xff0c;有兩種技術需要我們掌握&#xff0c;一個是技術上的能力&#xff0c;另一個是非技術上的能力。不幸的是&#xff0c;許多程序員過多地關注了技術上的能力&#xff0c;而忽略了非技術上的能力的培養&#xff0c;因此&#xff0c;我們的程序員們經…

CentOS下添加Root權限用戶‘超級用戶’方法(xxx is not in the sudoers file.This incident will be reported.的解決方法)

文章目錄1.添加普通用戶2.添加sudo文件的寫權限3.編輯sudoers文件4.撤銷sudoers文件寫權限1.添加普通用戶 [rootserver ~]# useradd fxd //添加一個名為fxd的用戶 [rootserver ~]# passwd fxd //修改密碼 Changing password for user chenjiafa. New UNIX password: //在這里輸…

android打印intent flag,Android flag詳解

Android flag詳解Android flag詳解一.Flag標志位在閱讀源碼的時候經常發現有一些標志屬性使用一些位操作來判斷是否具有該標志&#xff0c;增加標志或者去除標志。如&#xff1a;二.addFlags (int flags)和setFlags (int flags)區別Public Intent addFlags (int flags)增加額外…

人機界面設計

1.系統響應時間 系統響應時間指從用戶完成某個控制動作(例如&#xff0c;按回車鍵或單擊鼠標)&#xff0c;到軟件給出預期的響應(輸出信息或做動作)之間的這段時間。 系統響應時間有兩個重要屬性&#xff0c;分別是長度和易變性。 1&#xff09;長度&#xff1a;時間過長&#…

GeoHash資料

geohash基本原理 轉載于:https://www.cnblogs.com/hyl8218/p/9111410.html

開啟市場新格局 且看新華三計算與存儲新品發布會

全球領先的新IT解決方案領導者新華三將于8月31日在北京釣魚臺國賓館舉辦“新IT 新動能 新格局 新華三下一代計算與存儲發布會”&#xff0c;重磅發布服務器和存儲的全線新品。 2017年初&#xff0c;新華三集團正式推出了“應用驅動 云領未來”的新IT戰略。在這一戰略指引下&…

Centos7更新 SQLite3至版本3.29.0

文章目錄1.創建 src 目錄并進到這個目錄2.下載 sqlite3 源碼并解壓安裝3.替換系統低版本 sqlite31.創建 src 目錄并進到這個目錄 fxd用戶下&#xff1a; mkdir -p ~/src cd ~/src 2.下載 sqlite3 源碼并解壓安裝 fxd用戶下&#xff1a; wget https://sqlite.org/2019/sqlite…

開發人員必學的5門課程

越來越多的Web開發人員通常都會問一些同樣的問題。比如&#xff1a;哪一種開發語言最重要&#xff1f;初級開發人員的薪金會是多少&#xff1f;公司提供的免費培訓有用嗎&#xff1f;如何評估一個新的項目&#xff1f;盡管這些問題都很重要&#xff0c;但是開發人員往往對其他人…

android 響應類型,android – Retrofit 2 RxJava – Gson – “全局”反序列化,更改響應類型...

正如Than所說,使用攔截器的解決方案并不是那么好.我已經設法用一個Rx變壓器來解決這個問題.我還添加了自定義api異常,當出現問題時我可以拋出它并在onError中輕松處理它.我認為它更強大.響應包裝器&#xff1a;public class ApiResponse {private boolean success;private T da…

龜兔賽跑問題

題目 烏龜與兔子進行賽跑&#xff0c;跑場是一個矩型跑道&#xff0c;跑道邊可以隨地進行休息。烏龜每分鐘可以前進3米&#xff0c;兔子每分鐘前進9米&#xff1b;兔子嫌烏龜跑得慢&#xff0c;覺得肯定能跑贏烏龜&#xff0c;于是&#xff0c;每跑10分鐘回頭看一下烏龜&#x…