摘要:側(cè)邊欄已經(jīng)正確地顯示了最新文章列表歸檔分類(lèi)等信息。重啟一下開(kāi)發(fā)服務(wù)器,再次測(cè)試,發(fā)現(xiàn)可以顯示歸檔下的文章列表了。在分類(lèi)與歸檔追夢(mèng)人物的博客的評(píng)論區(qū)留言。將問(wèn)題的詳細(xì)描述通過(guò)郵件發(fā)送到,一般會(huì)在小時(shí)內(nèi)回復(fù)。
側(cè)邊欄已經(jīng)正確地顯示了最新文章列表、歸檔、分類(lèi)等信息?,F(xiàn)在來(lái)完善歸檔和分類(lèi)功能,當(dāng)用戶點(diǎn)擊歸檔下的某個(gè)日期或者分類(lèi)下的某個(gè)分類(lèi)時(shí),跳轉(zhuǎn)到文章列表頁(yè)面,顯示該日期或者分類(lèi)下的全部文章。
歸檔頁(yè)面要顯示某個(gè)歸檔日期下的文章列表,思路和顯示主頁(yè)文章列表是一樣的,回顧一下主頁(yè)視圖的代碼:
blog/views.py def index(request): post_list = Post.objects.all().order_by("-created_time") return render(request, "blog/index.html", context={"post_list": post_list})
主頁(yè)視圖函數(shù)中我們通過(guò) Post.objects.all() 獲取全部文章,而在我們的歸檔和分類(lèi)視圖中,我們不再使用 all 方法獲取全部文章,而是使用 filter 來(lái)根據(jù)條件過(guò)濾。先來(lái)看歸檔視圖:
blog/views.py def archives(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 函數(shù)來(lái)過(guò)濾文章。由于是按照日期歸檔,因此這里根據(jù)文章發(fā)表的年和月來(lái)過(guò)濾。具體來(lái)說(shuō),就是根據(jù) created_time 的 year 和 month 屬性過(guò)濾,篩選出文章發(fā)表在對(duì)應(yīng)的 year 年和 month 月的文章。注意這里 created_time 是 Python 的 date 對(duì)象,其有一個(gè) year 和 month 屬性,我們?cè)?頁(yè)面?zhèn)冗厵冢菏褂米远x模板標(biāo)簽 使用過(guò)這個(gè)屬性。Python 中類(lèi)實(shí)例調(diào)用屬性的方法通常是 created_time.year,但是由于這里作為函數(shù)的參數(shù)列表,所以 Django 要求我們把點(diǎn)替換成了兩個(gè)下劃線,即 created_time__year。同時(shí)和 index 視圖中一樣,我們對(duì)返回的文章列表進(jìn)行了排序。此外由于歸檔的下的文章列表的顯示和首頁(yè)是一樣的,因此我們直接渲染了index.html 模板。
寫(xiě)好視圖函數(shù)后就是配置好 URL:
blog/urls.py from django.conf.urls import url from . import views app_name = "blog" urlpatterns = [ url(r"^$", views.index, name="index"), url(r"^post/(?P[0-9]+)/$", views.detail, name="detail"), + url(r"^archives/(?P [0-9]{4})/(?P [0-9]{1,2})/$", views.archives, name="archives"), ]
這個(gè)歸檔視圖對(duì)應(yīng)的 URL 的正則表達(dá)式和 detail 視圖函數(shù)對(duì)應(yīng)的 URL 是類(lèi)似的,這在之前我們講過(guò)。兩個(gè)括號(hào)括起來(lái)的地方是兩個(gè)命名組參數(shù),Django 會(huì)從用戶訪問(wèn)的 URL 中自動(dòng)提取這兩個(gè)參數(shù)的值,然后傳遞給其對(duì)應(yīng)的視圖函數(shù)。例如如果用戶想查看 2017 年 3 月下的全部文章,他訪問(wèn) /archives/2017/3/,那么 archives 視圖函數(shù)的實(shí)際調(diào)用為:archives(request, year=2017, month=3)。
在模板找到歸檔列表部分的代碼,修改超鏈接的 href 屬性,讓用戶點(diǎn)擊超鏈接后跳轉(zhuǎn)到文章歸檔頁(yè)面:
templates/base.html {% for date in date_list %}
這里 {% url %} 這個(gè)模板標(biāo)簽的作用是解析視圖函數(shù) blog:archives 對(duì)應(yīng)的 URL 模式,并把 URL 模式中的年和月替換成 date.year,date.month 的值。例如 blog:archives 表示 blog 應(yīng)用下的 archives 函數(shù),這個(gè)函數(shù)對(duì)應(yīng)的 URL 模式為 ^archives/(?P
為什么要使用 {% url %} 模板標(biāo)簽?zāi)??事?shí)上,我們把超鏈接的 href 屬性設(shè)置為 /archives/{{ date.year }}/{{ date.month }}/ 同樣可以達(dá)到目的,但是這種寫(xiě)法是硬編碼的。雖然現(xiàn)在 blog:archives 視圖函數(shù)對(duì)應(yīng)的 URL 模式是這種形式,但是如果哪天這個(gè)模式改變了呢?如果使用了硬編碼的寫(xiě)法,那你需要把每一處 /archives/{{ date.year }}/{{ date.month }}/ 修改為新的模式。但如果使用了 {% url %} 模板標(biāo)簽,則不用做任何修改。
測(cè)試一下,點(diǎn)擊側(cè)邊欄歸檔的日期,跳轉(zhuǎn)到歸檔頁(yè)面,發(fā)現(xiàn)報(bào)了個(gè)錯(cuò)誤,提示沒(méi)有安裝 pytz。激活虛擬環(huán)境,使用 pip install pytz 安裝即可。
重啟一下開(kāi)發(fā)服務(wù)器,再次測(cè)試,發(fā)現(xiàn)可以顯示歸檔下的文章列表了。
分類(lèi)頁(yè)面同樣的寫(xiě)好分類(lèi)頁(yè)面的視圖函數(shù):
blog/views.py import markdown from django.shortcuts import render, get_object_or_404 # 引入 Category 類(lèi) from .models import Post, Category def category(request, pk): # 記得在開(kāi)始部分導(dǎo)入 Category 類(lèi) 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})
這里我們首先根據(jù)傳入的 pk 值(也就是被訪問(wèn)的分類(lèi)的 id 值)從數(shù)據(jù)庫(kù)中獲取到這個(gè)分類(lèi)。get_object_or_404 函數(shù)和 detail 視圖中一樣,其作用是如果用戶訪問(wèn)的分類(lèi)不存在,則返回一個(gè) 404 錯(cuò)誤頁(yè)面以提示用戶訪問(wèn)的資源不存在。然后我們通過(guò) filter 函數(shù)過(guò)濾出了該分類(lèi)下的全部文章。同樣也和首頁(yè)視圖中一樣對(duì)返回的文章列表進(jìn)行了排序。
URL 配置如下:
blog/urls.py from django.conf.urls import url from . import views app_name = "blog" urlpatterns = [ url(r"^$", views.index, name="index"), url(r"^post/(?P[0-9]+)/$", views.detail, name="detail"), url(r"^archives/(?P [0-9]{4})/(?P [0-9]{1,2})/$", views.archives, name="archives"), + url(r"^category/(?P [0-9]+)/$", views.category, name="category"), ]
這個(gè)分類(lèi)頁(yè)面對(duì)應(yīng)的 URL 模式和文章詳情頁(yè)面對(duì)應(yīng)的 URL 模式十分類(lèi)似,你可以自己分析分析它是如何工作的,在此就不贅述了。
修改相應(yīng)模板:
templates/base.html {% for category in category_list %}
同樣,{% url %} 模板標(biāo)簽的用法和寫(xiě)歸檔頁(yè)面時(shí)的用法是一樣的?,F(xiàn)在嘗試點(diǎn)擊相應(yīng)的鏈接,就可以跳轉(zhuǎn)到歸檔或者分類(lèi)頁(yè)面了。
總結(jié)本章節(jié)的代碼位于:Step11: category and archive。
如果遇到問(wèn)題,請(qǐng)通過(guò)下面的方式尋求幫助。
在 分類(lèi)與歸檔 - 追夢(mèng)人物的博客 的評(píng)論區(qū)留言。
將問(wèn)題的詳細(xì)描述通過(guò)郵件發(fā)送到 [email protected],一般會(huì)在 24 小時(shí)內(nèi)回復(fù)。
更多Django 教程,請(qǐng)?jiān)L問(wèn) 追夢(mèng)人物的博客。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44394.html
摘要:本教程內(nèi)容已過(guò)時(shí),更新版教程請(qǐng)?jiān)L問(wèn)博客開(kāi)發(fā)入門(mén)教程。表示降序排列,默認(rèn)是升序排列。學(xué)習(xí)小組簡(jiǎn)介學(xué)習(xí)小組是一個(gè)促進(jìn)新手互相學(xué)習(xí)互相幫助的組織。我們會(huì)將每周的詳細(xì)開(kāi)發(fā)文檔和代碼通過(guò)郵件列表發(fā)出。 本教程內(nèi)容已過(guò)時(shí),更新版教程請(qǐng)?jiān)L問(wèn): django 博客開(kāi)發(fā)入門(mén)教程。 通過(guò)前四周的時(shí)間我們開(kāi)發(fā)了一個(gè)簡(jiǎn)單的個(gè)人 Blog,教程地址: 第一周:Django 學(xué)習(xí)小組:博客開(kāi)發(fā)實(shí)戰(zhàn)第一周教程 ——...
摘要:我們的博客側(cè)邊欄有四項(xiàng)內(nèi)容最新文章歸檔分類(lèi)和標(biāo)簽云。更好的解決方案是直接在模板中獲取,為此,我們使用的一個(gè)新技術(shù)自定義模板標(biāo)簽來(lái)完成任務(wù)。注意要在使用任何下的模板標(biāo)簽以前導(dǎo)入它。在頁(yè)面?zhèn)冗厵谑褂米远x模板標(biāo)簽追夢(mèng)人物的博客的評(píng)論區(qū)留言。 我們的博客側(cè)邊欄有四項(xiàng)內(nèi)容:最新文章、歸檔、分類(lèi)和標(biāo)簽云。這些內(nèi)容相對(duì)比較固定,且在各個(gè)頁(yè)面都會(huì)顯示,如果像文章列表或者文章詳情一樣,從視圖函數(shù)中獲取...
摘要:本節(jié)接上周的文檔學(xué)習(xí)小組博客開(kāi)發(fā)實(shí)戰(zhàn)第一周教程編寫(xiě)博客的首頁(yè)面,我們繼續(xù)給博客添加功能,以及改善前面不合理的部分。返回該視圖要顯示的對(duì)象。目前小組正在完成第一個(gè)項(xiàng)目,本文即是該項(xiàng)目第二周的相關(guān)文檔。 本教程內(nèi)容已過(guò)時(shí),更新版教程請(qǐng)?jiān)L問(wèn): django 博客開(kāi)發(fā)入門(mén)教程。 上周我們完成了博客的 Model 部分,以及 Blog 的首頁(yè)視圖 IndexView。 本節(jié)接上周的文檔 Djan...
摘要:本教程內(nèi)容已過(guò)時(shí),更新版教程請(qǐng)?jiān)L問(wèn)博客開(kāi)發(fā)入門(mén)教程。我們的評(píng)論表單放在中,評(píng)論成功后返回到原始提交頁(yè)面。學(xué)習(xí)小組簡(jiǎn)介學(xué)習(xí)小組是一個(gè)促進(jìn)新手互相學(xué)習(xí)互相幫助的組織。 本教程內(nèi)容已過(guò)時(shí),更新版教程請(qǐng)?jiān)L問(wèn): django 博客開(kāi)發(fā)入門(mén)教程。 通過(guò)前四周的時(shí)間我們開(kāi)發(fā)了一個(gè)簡(jiǎn)單的個(gè)人 Blog,前幾期教程地址: 第一周:Django 學(xué)習(xí)小組:博客開(kāi)發(fā)實(shí)戰(zhàn)第一周教程 —— 編寫(xiě)博客的 Mode...
摘要:本教程內(nèi)容已過(guò)時(shí),更新版教程請(qǐng)?jiān)L問(wèn)博客開(kāi)發(fā)入門(mén)教程。我們的評(píng)論表單放在中,評(píng)論成功后返回到原始提交頁(yè)面。學(xué)習(xí)小組簡(jiǎn)介學(xué)習(xí)小組是一個(gè)促進(jìn)新手互相學(xué)習(xí)互相幫助的組織。 本教程內(nèi)容已過(guò)時(shí),更新版教程請(qǐng)?jiān)L問(wèn): django 博客開(kāi)發(fā)入門(mén)教程。 通過(guò)前四周的時(shí)間我們開(kāi)發(fā)了一個(gè)簡(jiǎn)單的個(gè)人 Blog,前幾期教程地址: 第一周:Django 學(xué)習(xí)小組:博客開(kāi)發(fā)實(shí)戰(zhàn)第一周教程 —— 編寫(xiě)博客的 Mode...
閱讀 3773·2021-09-22 15:17
閱讀 1959·2021-09-22 14:59
閱讀 2357·2020-12-03 17:00
閱讀 3222·2019-08-30 15:55
閱讀 495·2019-08-30 11:23
閱讀 3496·2019-08-29 13:56
閱讀 528·2019-08-29 12:54
閱讀 2266·2019-08-29 12:49