摘要:有了瀏覽量之后,文章受歡迎的程度就有了評價(jià)標(biāo)準(zhǔn)。隨之而來的就有根據(jù)瀏覽量對文章進(jìn)行排序的需求,即顯示最熱文章。它也是可以傳遞多個(gè)參數(shù)的,如,參數(shù)間用隔開視圖根據(jù)參數(shù)的值,判斷取出的文章如何排序方法指定對象如何進(jìn)行排序。
有了瀏覽量之后,文章受歡迎的程度就有了評價(jià)標(biāo)準(zhǔn)。隨之而來的就有根據(jù)瀏覽量對文章進(jìn)行排序的需求,即顯示“最熱文章”。
現(xiàn)在你已經(jīng)很熟悉MTV模式,不需要我啰嗦也能完成任務(wù):
文章的模型已經(jīng)有了,不需要寫Model了
寫一個(gè)視圖函數(shù)article_list_by_views(),取出按瀏覽排序后的文章對象
將文章對象傳遞到模板,并進(jìn)行渲染
很簡單,但也隱藏著問題:最熱文章列表和之前的普通文章列表相比,大部分功能其實(shí)都是相同的,僅僅是排序不同而已。
萬一哪天需要根據(jù)文章標(biāo)題排序呢?萬一還需要用戶id排序、標(biāo)簽排序、收藏排序...不僅如此,就連路由urls.py都要跟著膨脹。代碼會越來越臃腫且不可維護(hù)。
重復(fù)的代碼是萬惡之源。因此這里挑戰(zhàn)一下,不創(chuàng)建新的視圖/路由,而是將排序功能融合到已有的視圖/路由中。
視圖根據(jù)以上需求,重寫article_list():
article/views.py ... # 重寫文章列表 def article_list(request): # 根據(jù)GET請求中查詢條件 # 返回不同排序的對象數(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)知識如下:
前面用過GET請求傳遞單個(gè)參數(shù)。它也是可以傳遞多個(gè)參數(shù)的,如?a=1&b=2,參數(shù)間用&隔開
視圖根據(jù)GET參數(shù)order的值,判斷取出的文章如何排序
order_by()方法指定對象如何進(jìn)行排序。模型中有total_views這個(gè)整數(shù)字段,因此‘total_views’為正序,‘-total_views’為逆序
為什么把新變量order也傳遞到模板中?因?yàn)槲恼滦枰摚?b>order給模板一個(gè)標(biāo)識,提醒模板下一頁應(yīng)該如何排序
這樣一來,排序所需要的參數(shù)都可以通過查詢獲得,連urls.py都不用改寫了。
模板接下來修改文章列表模板:優(yōu)化入口,并且正確分頁:
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
頁碼導(dǎo)航中,所有的分頁鏈接都新增了order參數(shù)
測試啟動服務(wù)器,點(diǎn)擊“最熱”:
工作得很好!切換頁碼,留意地址欄中是如何變化的。
還剩一個(gè)小瑕疵:用戶點(diǎn)擊“最熱”按鈕后,此按鈕最好能夠變?yōu)榛疑⑶也豢牲c(diǎn)擊。這個(gè)精益求精的機(jī)會就留給讀者去優(yōu)化吧。
header.html中有一個(gè)小改動:"寫文章"的入口被挪到用戶下拉菜單中了。總結(jié)本章已經(jīng)摸到一個(gè)高級的編程領(lǐng)域門檻了:代碼復(fù)用。將類似功能的代碼合并到了一起,并且讓后續(xù)的功能擴(kuò)展變得很容易。只需要在視圖中寫幾個(gè)elif語句就搞定了。
在讀者以后的編程中,也要盡量優(yōu)化代碼結(jié)構(gòu),達(dá)到事半功倍的效果。
至此,博客雖小,功能卻相當(dāng)完整了。繼續(xù)努力!
有疑問請?jiān)诙刨惖膫€(gè)人網(wǎng)站留言,我會盡快回復(fù)。
或Email私信我:dusaiphoto@foxmail.com
項(xiàng)目完整代碼:Django_blog_tutorial
轉(zhuǎn)載請注明出處。文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/42918.html
摘要:更酷的是,我們希望搜索出來的文章也能夠按照時(shí)間熱度等各種方式進(jìn)行排序。若不為空,則檢索特定文章對象。總結(jié)本章完成了一個(gè)簡單的搜索功能,這對于個(gè)人博客來說應(yīng)該夠用了。 不管是最新文章列表也好、最熱文章列表也罷,都是把所有的文章數(shù)據(jù)全部展示給了用戶。 但是如果用戶只關(guān)心某些特定類型的文章,抽取全部數(shù)據(jù)就顯得既不方便、又不效率了。 因此,給用戶提供一個(gè)搜索功能,提供給用戶感興趣的幾篇文章,就...
摘要:而文章分類一個(gè)重要的途徑就是設(shè)置欄目。修改文件欄目的欄目標(biāo)題創(chuàng)建時(shí)間文章欄目的一對多外鍵欄目的有兩個(gè)字段,名稱和創(chuàng)建日期。修改文章的欄目功能,也就完成了。對個(gè)人博客來說,欄目數(shù)據(jù)的變動通常是很少的。 博客的文章類型通常不止一種:有時(shí)候你會寫高深莫測的技術(shù)文章,有時(shí)候又純粹只記錄一下當(dāng)天的心情。 因此對文章的分類就顯得相當(dāng)?shù)闹匾耍确奖悴┲鲗ξ恼逻M(jìn)行分類歸檔,也方便用戶有針對性的閱讀。...
摘要:每一篇文章的標(biāo)簽可能都不一樣,并且還可能擁有多個(gè)標(biāo)簽,這是與欄目功能不同的。列表中顯示標(biāo)簽雖然保存標(biāo)簽的功能已經(jīng)實(shí)現(xiàn)了,還得把它顯示出來才行。更多的用法請閱讀官方文檔總結(jié)本章學(xué)習(xí)了使用來完成標(biāo)簽功能。 標(biāo)簽是作者從文章中提取的核心詞匯,其他用戶可以通過標(biāo)簽快速了解文章的關(guān)注點(diǎn)。每一篇文章的標(biāo)簽可能都不一樣,并且還可能擁有多個(gè)標(biāo)簽,這是與欄目功能不同的。 好在標(biāo)簽功能也有優(yōu)秀的三方庫:D...
摘要:文章瀏覽量是所有社交類網(wǎng)站所必備的數(shù)據(jù),足以顯示其重要性了。總結(jié)本章完成了簡單的統(tǒng)計(jì)瀏覽量的功能,并且在前后端中對用戶的身份進(jìn)行了驗(yàn)證。下一章學(xué)習(xí)與瀏覽量緊密相關(guān)的功能查詢最熱文章。 文章瀏覽量是所有社交類網(wǎng)站所必備的數(shù)據(jù),足以顯示其重要性了。 博主可以通過瀏覽量來評估某篇文章的受歡迎程度,讀者也能夠通過瀏覽量來篩選質(zhì)量更高的文章。 然而,準(zhǔn)確統(tǒng)計(jì)瀏覽量并不簡單: 某些類型的請求不應(yīng)...
摘要:在里寫一個(gè)數(shù)據(jù)庫驅(qū)動的應(yīng)用的第一步是定義模型,也就是數(shù)據(jù)庫結(jié)構(gòu)設(shè)計(jì)和附加的其它元數(shù)據(jù)。模型元數(shù)據(jù)是任何不是字段的東西,例如排序選項(xiàng)數(shù)據(jù)庫表名單數(shù)和復(fù)數(shù)名稱和。 Django 框架主要關(guān)注的是模型(Model)、模板(Template)和視圖(Views),稱為MTV模式。 它們各自的職責(zé)如下: 層次 職責(zé) 模型(Model),即數(shù)據(jù)存取層 處理與數(shù)據(jù)相關(guān)的所有事務(wù): 如何存取...
閱讀 1291·2021-09-22 15:00
閱讀 3309·2019-08-30 14:00
閱讀 1220·2019-08-29 17:27
閱讀 1220·2019-08-29 16:35
閱讀 689·2019-08-29 16:14
閱讀 2042·2019-08-26 13:43
閱讀 2117·2019-08-26 11:35
閱讀 2309·2019-08-23 15:34