成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Django 博客開(kāi)發(fā)教程 11 - 分類(lèi)與歸檔

happyhuangjinjin / 1231人閱讀

摘要:側(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_timeyearmonth 屬性過(guò)濾,篩選出文章發(fā)表在對(duì)應(yīng)的 year 年和 month 月的文章。注意這里 created_time 是 Python 的 date 對(duì)象,其有一個(gè) yearmonth 屬性,我們?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 %}
  • {{ date.year }} 年 {{ date.month }} 月
  • {% endfor %}

    這里 {% 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[0-9]{4})/(?P[0-9]{1,2})/$,假設(shè) date.year=2017date.month=5,那么 {% url "blog:archives" date.year date.month %} 模板標(biāo)簽返回的值為/archives/2017/5/。

    為什么要使用 {% 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 %}
    
  • {{ category.name }}
  • {% endfor %}

    同樣,{% 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

    相關(guān)文章

    • Django 學(xué)習(xí)小組:博客開(kāi)發(fā)實(shí)戰(zhàn)第四周——標(biāo)簽云文章歸檔

      摘要:本教程內(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)第一周教程 ——...

      RichardXG 評(píng)論0 收藏0
    • Django 博客開(kāi)發(fā)教程 10 - 頁(yè)面?zhèn)冗厵冢菏褂米远x模板標(biāo)簽

      摘要:我們的博客側(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ù)中獲取...

      summerpxy 評(píng)論0 收藏0
    • Django 學(xué)習(xí)小組:博客開(kāi)發(fā)實(shí)戰(zhàn)第二周教程 —— 實(shí)現(xiàn)博客詳情頁(yè)面和分類(lèi)頁(yè)面

      摘要:本節(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...

      ingood 評(píng)論0 收藏0
    • Django 學(xué)習(xí)小組:博客開(kāi)發(fā)實(shí)戰(zhàn)第五周教程 —— 實(shí)現(xiàn)評(píng)論功能

      摘要:本教程內(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...

      CoderStudy 評(píng)論0 收藏0
    • Django 學(xué)習(xí)小組:博客開(kāi)發(fā)實(shí)戰(zhàn)第五周教程 —— 實(shí)現(xiàn)評(píng)論功能

      摘要:本教程內(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...

      kumfo 評(píng)論0 收藏0

    發(fā)表評(píng)論

    0條評(píng)論

    最新活動(dòng)
    閱讀需要支付1元查看
    <