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