摘要:更酷的是,我們希望搜索出來的文章也能夠按照時間熱度等各種方式進行排序。若不為空,則檢索特定文章對象。總結本章完成了一個簡單的搜索功能,這對于個人博客來說應該夠用了。
不管是最新文章列表也好、最熱文章列表也罷,都是把所有的文章數據全部展示給了用戶。
但是如果用戶只關心某些特定類型的文章,抽取全部數據就顯得既不方便、又不效率了。
因此,給用戶提供一個搜索功能,提供給用戶感興趣的幾篇文章,就大有用處了。
準備工作 邏輯盡管細節不同,但是搜索和列表有很多類似的地方:它們都是先檢索出一些文章對象,并將其展示給用戶。上一章已經說過,代碼重復是萬惡之源,好的實踐必須把功能類似的模塊盡量復用起來。基于這個原則,我們打算繼續在原有的article_list()上添磚加瓦,讓其功能更加的強大。
隨著項目越來越龐大,又需要將功能復雜的模塊拆分成更簡單的多個模塊。目前我們還不用擔心這個問題。
更酷的是,我們希望搜索出來的文章也能夠按照時間、熱度等各種方式進行排序。因此需要構造一個新的參數search,能夠和之前的order參數進行聯合查詢。
GET還是POST?用戶搜索內容時提交的文本,可以用GET請求提交,也可以用POST請求提交。根據實際的需要進行選擇。
因為order是用GET提交的,并且翻頁是GET請求,因此選擇GET方式提交搜索文本,可以方便地和之前的模塊結合起來。
之前我們已經用過表單組件,通過POST請求提交數據。表單組件同樣也可以提交GET請求,只要去掉method="POST"屬性就可以了。
Q對象Model.objects.all()能夠返回表中的所有對象。
對應的,Model.objects.filter(**kwargs)可以返回與給定參數匹配的部分對象。
還有Model.objects.exclude(**kwargs)返回與給定參數不匹配的對象
如果想對多個參數進行查詢怎么辦?比如同時查詢文章標題和正文內容。這時候就需要Q對象。
視圖那么按照前面說好的,修改article_list():
article/views.py ... # 引入 Q 對象 from django.db.models import Q def article_list(request): search = request.GET.get("search") order = request.GET.get("order") # 用戶搜索邏輯 if search: if order == "total_views": # 用 Q對象 進行聯合搜索 article_list = ArticlePost.objects.filter( Q(title__icontains=search) | Q(body__icontains=search) ).order_by("-total_views") else: article_list = ArticlePost.objects.filter( Q(title__icontains=search) | Q(body__icontains=search) ) else: # 將 search 參數重置為空 search = "" if order == "total_views": article_list = ArticlePost.objects.all().order_by("-total_views") else: article_list = ArticlePost.objects.all() paginator = Paginator(article_list, 3) page = request.GET.get("page") articles = paginator.get_page(page) # 增加 search 到 context context = { "articles": articles, "order": order, "search": search } return render(request, "article/list.html", context) ...
重點知識如下:
新增參數search,存放需要搜索的文本。若search不為空,則檢索特定文章對象。
留意filter中Q對象的用法。Q(title__icontains=search)意思是在模型的title字段查詢,icontains是不區分大小寫的包含,中間用兩個下劃線隔開。search是需要查詢的文本。多個Q對象用管道符|隔開,就達到了聯合查詢的目的。
icontains不區分大小寫,對應的contains區分大小寫
為什么需要search = ""語句?如果用戶沒有搜索操作,則search = request.GET.get("search")會使得search = None,而這個值傳遞到模板中會錯誤地轉換成"None"字符串!等同于用戶在搜索“None”關鍵字,這明顯是錯誤的。
完成本章內容后,可以刪除此語句看看效果
除此之外還有一點小的代碼優化工作:將需要重復用到order = request.GET.get("order")提取到頂部,讓模塊稍稍清爽一點。
模板還是修改文章列表的模板文件。
需要修改的內容稍多,仔細一些不要看錯:
templates/article/list.html ...{% if search %} {% if articles %}"{{ search }}"的搜索結果如下:
{% else %}暫無"{{ search }}"有關的文章。
{% endif %} {% endif %} ... ... ... ... ...面包屑組件、頁碼組件都改動了href:增加了search參數
新增搜索欄,以GET請求提交search參數;required屬性阻止用戶提交空白文本
新增搜索提示語。好的UI必須讓用戶了解當前的狀態
Emmm...想想也不用改動其他東西了。
開始測試吧!
測試還是打開文章列表頁面:
出現了搜索欄!并且翻頁、最熱等功能一切正常。
在搜索欄中輸入“PYTHON”,結果如下:
成功將標題或正文中含有"python"關鍵字的文章檢索出來了,并且是忽略大小寫的。點擊最熱可以讓檢索結果按瀏覽量排序,翻頁功能也正常工作。很好,達成了目標!
學到這里的讀者應該感到自豪:你用了同一個url,集成了很多種功能,展示了不同的內容!這對新手來說其實并不容易做到。
這種方法有一個小缺點:有的時候url中會包含像search=""(空值)這樣無意義的字符串,強迫癥簡直不能忍。所幸這無傷大雅,通常用戶并不會關心你的url是什么樣子的,只要網頁美觀好用就行。總結本章完成了一個簡單的搜索功能,這對于個人博客來說應該夠用了。
更加復雜、深度定制的搜索可以借助第三方模塊,如Haystack。
另外筆者這樣實現搜索不一定是最優的。相信你已經掌握多種途徑來實現搜索功能了(POST請求?搜索專用視圖?另寫url?),盡情嘗試一番吧。
有疑問請在杜賽的個人網站留言,我會盡快回復。
或Email私信我:dusaiphoto@foxmail.com
項目完整代碼:Django_blog_tutorial
轉載請注明出處。文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/42915.html
摘要:教程看到這里,你已經學會如下內容搭建開發環境博文管理用戶管理發表評論若干小功能搭建簡單的小博客,以上的功能夠用了。教程為了起步平緩,沒有展開這方面的內容。陌生人,祝你學業進步事業有成歡迎常到杜賽的個人網站做客 教程看到這里,你已經學會如下內容: 搭建開發環境 博文管理 用戶管理 發表評論 若干小功能 搭建簡單的小博客,以上的功能夠用了。 相信你的志向不止于此。畢竟程序員面試個個造火...
摘要:改寫視圖函數上一章我們感受了視圖的工作流程。循壞表示依次取出中的元素,命名為,并分別執行接下來操作。即為語言,中間包裹了一個段落的文字。有疑問請在杜賽的個人網站留言,我會盡快回復。 改寫視圖函數 上一章我們感受了視圖的工作流程。 為了讓視圖真正發揮作用,改寫article/views.py中的article_list視圖函數: article/views.py from django...
摘要:每一篇文章的標簽可能都不一樣,并且還可能擁有多個標簽,這是與欄目功能不同的。列表中顯示標簽雖然保存標簽的功能已經實現了,還得把它顯示出來才行。更多的用法請閱讀官方文檔總結本章學習了使用來完成標簽功能。 標簽是作者從文章中提取的核心詞匯,其他用戶可以通過標簽快速了解文章的關注點。每一篇文章的標簽可能都不一樣,并且還可能擁有多個標簽,這是與欄目功能不同的。 好在標簽功能也有優秀的三方庫:D...
摘要:語法支持再次打開文件,在文件的最后添加指明了使用語法標記,做了兩個拓展,其中表示支持語法高亮,包含的特性請參見相關文檔。語法高亮支持注意這一步必須在安裝完主題之后。 目前網上搭建個人博客的方案很多,雖然使用諸如 Wordpress ( PHP )、Hexo ( Node.js ) 等可以方便快速地搭建一款功能齊全的高性能個人博客,但是本文將嘗試一種更為小眾化的方案 —— 一款基于 dj...
摘要:而文章分類一個重要的途徑就是設置欄目。修改文件欄目的欄目標題創建時間文章欄目的一對多外鍵欄目的有兩個字段,名稱和創建日期。修改文章的欄目功能,也就完成了。對個人博客來說,欄目數據的變動通常是很少的。 博客的文章類型通常不止一種:有時候你會寫高深莫測的技術文章,有時候又純粹只記錄一下當天的心情。 因此對文章的分類就顯得相當的重要了,既方便博主對文章進行分類歸檔,也方便用戶有針對性的閱讀。...
閱讀 3072·2021-11-23 09:51
閱讀 1052·2021-09-02 15:21
閱讀 3021·2019-08-30 13:56
閱讀 1846·2019-08-29 14:12
閱讀 718·2019-08-29 13:53
閱讀 1679·2019-08-29 11:32
閱讀 1340·2019-08-29 11:25
閱讀 1507·2019-08-28 17:51