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

資訊專欄INFORMATION COLUMN

Django搭建個(gè)人博客:根據(jù)瀏覽量對(duì)最熱文章排序

kidsamong / 3068人閱讀

摘要:有了瀏覽量之后,文章受歡迎的程度就有了評(píng)價(jià)標(biāo)準(zhǔn)。隨之而來(lái)的就有根據(jù)瀏覽量對(duì)文章進(jìn)行排序的需求,即顯示最熱文章。它也是可以傳遞多個(gè)參數(shù)的,如,參數(shù)間用隔開(kāi)視圖根據(jù)參數(shù)的值,判斷取出的文章如何排序方法指定對(duì)象如何進(jìn)行排序。

有了瀏覽量之后,文章受歡迎的程度就有了評(píng)價(jià)標(biāo)準(zhǔn)。隨之而來(lái)的就有根據(jù)瀏覽量對(duì)文章進(jìn)行排序的需求,即顯示“最熱文章”。

現(xiàn)在你已經(jīng)很熟悉MTV模式,不需要我啰嗦也能完成任務(wù):

文章的模型已經(jīng)有了,不需要寫(xiě)Model了

寫(xiě)一個(gè)視圖函數(shù)article_list_by_views(),取出按瀏覽排序后的文章對(duì)象

將文章對(duì)象傳遞到模板,并進(jìn)行渲染

很簡(jiǎn)單,但也隱藏著問(wèn)題:最熱文章列表和之前的普通文章列表相比,大部分功能其實(shí)都是相同的,僅僅是排序不同而已。

萬(wàn)一哪天需要根據(jù)文章標(biāo)題排序呢?萬(wàn)一還需要用戶id排序、標(biāo)簽排序、收藏排序...不僅如此,就連路由urls.py都要跟著膨脹。代碼會(huì)越來(lái)越臃腫且不可維護(hù)。

重復(fù)的代碼是萬(wàn)惡之源。因此這里挑戰(zhàn)一下,不創(chuàng)建新的視圖/路由,而是將排序功能融合到已有的視圖/路由中。

視圖

根據(jù)以上需求,重寫(xiě)article_list()

article/views.py

...
# 重寫(xiě)文章列表
def article_list(request):
    # 根據(jù)GET請(qǐng)求中查詢條件
    # 返回不同排序的對(duì)象數(shù)組
    if request.GET.get("order") == "total_views":
        article_list = ArticlePost.objects.all().order_by("-total_views")
        order = "total_views"
    else:
        article_list = ArticlePost.objects.all()
        order = "normal"

    paginator = Paginator(article_list, 3)
    page = request.GET.get("page")
    articles = paginator.get_page(page)
    
    # 修改此行
    context = { "articles": articles, "order": order }
    
    return render(request, "article/list.html", context)

重點(diǎn)知識(shí)如下:

前面用過(guò)GET請(qǐng)求傳遞單個(gè)參數(shù)。它也是可以傳遞多個(gè)參數(shù)的,如?a=1&b=2,參數(shù)間用&隔開(kāi)

視圖根據(jù)GET參數(shù)order的值,判斷取出的文章如何排序

order_by()方法指定對(duì)象如何進(jìn)行排序。模型中有total_views這個(gè)整數(shù)字段,因此‘total_views’為正序,‘-total_views’為逆序

為什么把新變量order也傳遞到模板中?因?yàn)槲恼滦枰?yè)!order給模板一個(gè)標(biāo)識(shí),提醒模板下一頁(yè)應(yīng)該如何排序

這樣一來(lái),排序所需要的參數(shù)都可以通過(guò)查詢獲得,連urls.py都不用改寫(xiě)了。

模板

接下來(lái)修改文章列表模板:優(yōu)化入口,并且正確分頁(yè):

templates/article/list.html

...

{% for article in articles %} ... {% endfor %}
... « 1 ... ... ... {% if articles.has_next %} {{ articles.next_page_number }} ... {{ articles.paginator.num_pages }} » ...

新增了Bootstrap中的面包屑導(dǎo)航樣式breadcrumb

頁(yè)碼導(dǎo)航中,所有的分頁(yè)鏈接都新增了order參數(shù)

測(cè)試

啟動(dòng)服務(wù)器,點(diǎn)擊“最熱”:

工作得很好!切換頁(yè)碼,留意地址欄中是如何變化的。

還剩一個(gè)小瑕疵:用戶點(diǎn)擊“最熱”按鈕后,此按鈕最好能夠變?yōu)榛疑?,并且不可點(diǎn)擊。這個(gè)精益求精的機(jī)會(huì)就留給讀者去優(yōu)化吧。

header.html中有一個(gè)小改動(dòng):"寫(xiě)文章"的入口被挪到用戶下拉菜單中了。
總結(jié)

本章已經(jīng)摸到一個(gè)高級(jí)的編程領(lǐng)域門(mén)檻了:代碼復(fù)用。將類似功能的代碼合并到了一起,并且讓后續(xù)的功能擴(kuò)展變得很容易。只需要在視圖中寫(xiě)幾個(gè)elif語(yǔ)句就搞定了。

在讀者以后的編程中,也要盡量?jī)?yōu)化代碼結(jié)構(gòu),達(dá)到事半功倍的效果。

至此,博客雖小,功能卻相當(dāng)完整了。繼續(xù)努力!

有疑問(wèn)請(qǐng)?jiān)诙刨惖膫€(gè)人網(wǎng)站留言,我會(huì)盡快回復(fù)。

或Email私信我:[email protected]

項(xiàng)目完整代碼:Django_blog_tutorial

轉(zhuǎn)載請(qǐng)注明出處。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42918.html

相關(guān)文章

  • Django搭建個(gè)人博客:簡(jiǎn)單搜索博客文章

    摘要:更酷的是,我們希望搜索出來(lái)的文章也能夠按照時(shí)間熱度等各種方式進(jìn)行排序。若不為空,則檢索特定文章對(duì)象??偨Y(jié)本章完成了一個(gè)簡(jiǎn)單的搜索功能,這對(duì)于個(gè)人博客來(lái)說(shuō)應(yīng)該夠用了。 不管是最新文章列表也好、最熱文章列表也罷,都是把所有的文章數(shù)據(jù)全部展示給了用戶。 但是如果用戶只關(guān)心某些特定類型的文章,抽取全部數(shù)據(jù)就顯得既不方便、又不效率了。 因此,給用戶提供一個(gè)搜索功能,提供給用戶感興趣的幾篇文章,就...

    Alan 評(píng)論0 收藏0
  • Django搭建個(gè)人博客:設(shè)置文章的欄目

    摘要:而文章分類一個(gè)重要的途徑就是設(shè)置欄目。修改文件欄目的欄目標(biāo)題創(chuàng)建時(shí)間文章欄目的一對(duì)多外鍵欄目的有兩個(gè)字段,名稱和創(chuàng)建日期。修改文章的欄目功能,也就完成了。對(duì)個(gè)人博客來(lái)說(shuō),欄目數(shù)據(jù)的變動(dòng)通常是很少的。 博客的文章類型通常不止一種:有時(shí)候你會(huì)寫(xiě)高深莫測(cè)的技術(shù)文章,有時(shí)候又純粹只記錄一下當(dāng)天的心情。 因此對(duì)文章的分類就顯得相當(dāng)?shù)闹匾耍确奖悴┲鲗?duì)文章進(jìn)行分類歸檔,也方便用戶有針對(duì)性的閱讀。...

    keelii 評(píng)論0 收藏0
  • Django搭建個(gè)人博客文章標(biāo)簽功能

    摘要:每一篇文章的標(biāo)簽可能都不一樣,并且還可能擁有多個(gè)標(biāo)簽,這是與欄目功能不同的。列表中顯示標(biāo)簽雖然保存標(biāo)簽的功能已經(jīng)實(shí)現(xiàn)了,還得把它顯示出來(lái)才行。更多的用法請(qǐng)閱讀官方文檔總結(jié)本章學(xué)習(xí)了使用來(lái)完成標(biāo)簽功能。 標(biāo)簽是作者從文章中提取的核心詞匯,其他用戶可以通過(guò)標(biāo)簽快速了解文章的關(guān)注點(diǎn)。每一篇文章的標(biāo)簽可能都不一樣,并且還可能擁有多個(gè)標(biāo)簽,這是與欄目功能不同的。 好在標(biāo)簽功能也有優(yōu)秀的三方庫(kù):D...

    Amio 評(píng)論0 收藏0
  • Django搭建個(gè)人博客:統(tǒng)計(jì)文章覽量

    摘要:文章瀏覽量是所有社交類網(wǎng)站所必備的數(shù)據(jù),足以顯示其重要性了??偨Y(jié)本章完成了簡(jiǎn)單的統(tǒng)計(jì)瀏覽量的功能,并且在前后端中對(duì)用戶的身份進(jìn)行了驗(yàn)證。下一章學(xué)習(xí)與瀏覽量緊密相關(guān)的功能查詢最熱文章。 文章瀏覽量是所有社交類網(wǎng)站所必備的數(shù)據(jù),足以顯示其重要性了。 博主可以通過(guò)瀏覽量來(lái)評(píng)估某篇文章的受歡迎程度,讀者也能夠通過(guò)瀏覽量來(lái)篩選質(zhì)量更高的文章。 然而,準(zhǔn)確統(tǒng)計(jì)瀏覽量并不簡(jiǎn)單: 某些類型的請(qǐng)求不應(yīng)...

    n7then 評(píng)論0 收藏0
  • Django搭建個(gè)人博客:編寫(xiě)博客文章的Model模型

    摘要:在里寫(xiě)一個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)的應(yīng)用的第一步是定義模型,也就是數(shù)據(jù)庫(kù)結(jié)構(gòu)設(shè)計(jì)和附加的其它元數(shù)據(jù)。模型元數(shù)據(jù)是任何不是字段的東西,例如排序選項(xiàng)數(shù)據(jù)庫(kù)表名單數(shù)和復(fù)數(shù)名稱和。 Django 框架主要關(guān)注的是模型(Model)、模板(Template)和視圖(Views),稱為MTV模式。 它們各自的職責(zé)如下: 層次 職責(zé) 模型(Model),即數(shù)據(jù)存取層 處理與數(shù)據(jù)相關(guān)的所有事務(wù): 如何存取...

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

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

0條評(píng)論

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