摘要:有了瀏覽量之后,文章受歡迎的程度就有了評價標準。隨之而來的就有根據瀏覽量對文章進行排序的需求,即顯示最熱文章。它也是可以傳遞多個參數的,如,參數間用隔開視圖根據參數的值,判斷取出的文章如何排序方法指定對象如何進行排序。
有了瀏覽量之后,文章受歡迎的程度就有了評價標準。隨之而來的就有根據瀏覽量對文章進行排序的需求,即顯示“最熱文章”。
現在你已經很熟悉MTV模式,不需要我啰嗦也能完成任務:
文章的模型已經有了,不需要寫Model了
寫一個視圖函數article_list_by_views(),取出按瀏覽排序后的文章對象
將文章對象傳遞到模板,并進行渲染
很簡單,但也隱藏著問題:最熱文章列表和之前的普通文章列表相比,大部分功能其實都是相同的,僅僅是排序不同而已。
萬一哪天需要根據文章標題排序呢?萬一還需要用戶id排序、標簽排序、收藏排序...不僅如此,就連路由urls.py都要跟著膨脹。代碼會越來越臃腫且不可維護。
重復的代碼是萬惡之源。因此這里挑戰一下,不創建新的視圖/路由,而是將排序功能融合到已有的視圖/路由中。
視圖根據以上需求,重寫article_list():
article/views.py ... # 重寫文章列表 def article_list(request): # 根據GET請求中查詢條件 # 返回不同排序的對象數組 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)
重點知識如下:
前面用過GET請求傳遞單個參數。它也是可以傳遞多個參數的,如?a=1&b=2,參數間用&隔開
視圖根據GET參數order的值,判斷取出的文章如何排序
order_by()方法指定對象如何進行排序。模型中有total_views這個整數字段,因此‘total_views’為正序,‘-total_views’為逆序
為什么把新變量order也傳遞到模板中?因為文章需要翻頁!order給模板一個標識,提醒模板下一頁應該如何排序
這樣一來,排序所需要的參數都可以通過查詢獲得,連urls.py都不用改寫了。
模板接下來修改文章列表模板:優化入口,并且正確分頁:
templates/article/list.html ...{% for article in articles %} ... {% endfor %}... « 1 ... ... ... {% if articles.has_next %} {{ articles.next_page_number }} ... {{ articles.paginator.num_pages }} » ...新增了Bootstrap中的面包屑導航樣式breadcrumb
頁碼導航中,所有的分頁鏈接都新增了order參數
測試啟動服務器,點擊“最熱”:
工作得很好!切換頁碼,留意地址欄中是如何變化的。
還剩一個小瑕疵:用戶點擊“最熱”按鈕后,此按鈕最好能夠變為灰色,并且不可點擊。這個精益求精的機會就留給讀者去優化吧。
header.html中有一個小改動:"寫文章"的入口被挪到用戶下拉菜單中了。總結本章已經摸到一個高級的編程領域門檻了:代碼復用。將類似功能的代碼合并到了一起,并且讓后續的功能擴展變得很容易。只需要在視圖中寫幾個elif語句就搞定了。
在讀者以后的編程中,也要盡量優化代碼結構,達到事半功倍的效果。
至此,博客雖小,功能卻相當完整了。繼續努力!
有疑問請在杜賽的個人網站留言,我會盡快回復。
或Email私信我:dusaiphoto@foxmail.com
項目完整代碼:Django_blog_tutorial
轉載請注明出處。文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42918.html
摘要:更酷的是,我們希望搜索出來的文章也能夠按照時間熱度等各種方式進行排序。若不為空,則檢索特定文章對象。總結本章完成了一個簡單的搜索功能,這對于個人博客來說應該夠用了。 不管是最新文章列表也好、最熱文章列表也罷,都是把所有的文章數據全部展示給了用戶。 但是如果用戶只關心某些特定類型的文章,抽取全部數據就顯得既不方便、又不效率了。 因此,給用戶提供一個搜索功能,提供給用戶感興趣的幾篇文章,就...
摘要:而文章分類一個重要的途徑就是設置欄目。修改文件欄目的欄目標題創建時間文章欄目的一對多外鍵欄目的有兩個字段,名稱和創建日期。修改文章的欄目功能,也就完成了。對個人博客來說,欄目數據的變動通常是很少的。 博客的文章類型通常不止一種:有時候你會寫高深莫測的技術文章,有時候又純粹只記錄一下當天的心情。 因此對文章的分類就顯得相當的重要了,既方便博主對文章進行分類歸檔,也方便用戶有針對性的閱讀。...
摘要:每一篇文章的標簽可能都不一樣,并且還可能擁有多個標簽,這是與欄目功能不同的。列表中顯示標簽雖然保存標簽的功能已經實現了,還得把它顯示出來才行。更多的用法請閱讀官方文檔總結本章學習了使用來完成標簽功能。 標簽是作者從文章中提取的核心詞匯,其他用戶可以通過標簽快速了解文章的關注點。每一篇文章的標簽可能都不一樣,并且還可能擁有多個標簽,這是與欄目功能不同的。 好在標簽功能也有優秀的三方庫:D...
摘要:文章瀏覽量是所有社交類網站所必備的數據,足以顯示其重要性了。總結本章完成了簡單的統計瀏覽量的功能,并且在前后端中對用戶的身份進行了驗證。下一章學習與瀏覽量緊密相關的功能查詢最熱文章。 文章瀏覽量是所有社交類網站所必備的數據,足以顯示其重要性了。 博主可以通過瀏覽量來評估某篇文章的受歡迎程度,讀者也能夠通過瀏覽量來篩選質量更高的文章。 然而,準確統計瀏覽量并不簡單: 某些類型的請求不應...
摘要:在里寫一個數據庫驅動的應用的第一步是定義模型,也就是數據庫結構設計和附加的其它元數據。模型元數據是任何不是字段的東西,例如排序選項數據庫表名單數和復數名稱和。 Django 框架主要關注的是模型(Model)、模板(Template)和視圖(Views),稱為MTV模式。 它們各自的職責如下: 層次 職責 模型(Model),即數據存取層 處理與數據相關的所有事務: 如何存取...
閱讀 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