摘要:有了瀏覽量之后,文章受歡迎的程度就有了評(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
摘要:更酷的是,我們希望搜索出來(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è)搜索功能,提供給用戶感興趣的幾篇文章,就...
摘要:而文章分類一個(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ì)性的閱讀。...
摘要:每一篇文章的標(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...
摘要:文章瀏覽量是所有社交類網(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)...
摘要:在里寫(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ù): 如何存取...
閱讀 1323·2021-09-22 15:00
閱讀 3315·2019-08-30 14:00
閱讀 1232·2019-08-29 17:27
閱讀 1228·2019-08-29 16:35
閱讀 702·2019-08-29 16:14
閱讀 2048·2019-08-26 13:43
閱讀 2129·2019-08-26 11:35
閱讀 2314·2019-08-23 15:34