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