最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django 博客實現(xiàn)簡單的全文搜索的示例代碼

 更新時間:2020年02月17日 14:56:33   作者:削微寒  
這篇文章主要介紹了Django 博客實現(xiàn)簡單的全文搜索的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

作者:HelloGitHub-追夢人物

文中所涉及的示例代碼,已同步更新到 HelloGitHub-Team 倉庫

搜索是一個復(fù)雜的功能,但對于一些簡單的搜索任務(wù),我們可以使用 Django Model 層提供的一些內(nèi)置方法來完成?,F(xiàn)在我們來為我們的博客提供一個簡單的搜索功能。

概述

博客文章通常包含標(biāo)題和正文兩個部分。當(dāng)用戶輸入某個關(guān)鍵詞進行搜索后,我們希望為用戶顯示標(biāo)題和正文中含有被搜索關(guān)鍵詞的全部文章。整個搜索的過程如下:

  1. 用戶在搜素框中輸入搜索關(guān)鍵詞,假設(shè)為 “django”,然后用戶點擊了搜索按鈕提交其輸入的結(jié)果到服務(wù)器。
  2. 服務(wù)器接收到用戶輸入的搜索關(guān)鍵詞 “django” 后去數(shù)據(jù)庫查找文章標(biāo)題和正文中含有該關(guān)鍵詞的全部文章。
  3. 服務(wù)器將查詢結(jié)果返回給用戶。

整個過程就是這樣,下面來看看 Django 如何用實現(xiàn)這些過程。

將關(guān)鍵詞提交給服務(wù)器

先來回顧一下我們的 Django 博客的 Post(文章)模型:

blog/models.py

class Post(models.Model):
  # 標(biāo)題
  title = models.CharField("標(biāo)題", max_length=70)
  # 正文
  body = models.TextField("正文")
  
  # 其他屬性...
  
  def __str__(self):
    return self.title

先看到第 1 步,用戶在搜索框輸入搜索關(guān)鍵詞,因此我們要在博客上為用戶提供一個搜索表單,HTML 表單代碼大概像這樣:

templates/base.html

<form role="search" method="get" id="searchform" action="{% url 'blog:search' %}">
 <input type="search" name="q" placeholder="搜索" required>
 <button type="submit"><span class="ion-ios-search-strong"></span></button>
</form>

特別注意這里 <input type="search" name="q" placeholder="搜索" required> 中的 name 屬性,當(dāng)用戶在這個 input 中輸入搜索內(nèi)容并提交表單后,鍵入的數(shù)據(jù)會以鍵值對的形式提交服務(wù)器,這個鍵的名字就是通過 name 屬性指定的。這樣服務(wù)器就可以根據(jù) name 的值來取得用戶輸入的內(nèi)容。

用戶輸入了搜索關(guān)鍵詞并點擊了搜索按鈕后,數(shù)據(jù)就被發(fā)送給了 Django 后臺服務(wù)器。表單的 action 屬性的值為 {% url 'blog:search' %}(雖然我們還沒有寫這個視圖函數(shù)),表明用戶提交的結(jié)果將被發(fā)送給 blog 應(yīng)用下 search 視圖函數(shù)對應(yīng)的 URL。

查找含有搜索關(guān)鍵詞的文章

搜索的功能將由 search 視圖函數(shù)提供,代碼寫在 blog/views.py 里:

blog/views.py

from django.contrib import messages

def search(request):
  q = request.GET.get('q')

  if not q:
    error_msg = "請輸入搜索關(guān)鍵詞"
    messages.add_message(request, messages.ERROR, error_msg, extra_tags='danger')
    return redirect('blog:index')

  post_list = Post.objects.filter(Q(title__icontains=q) | Q(body__icontains=q))
  return render(request, 'blog/index.html', {'post_list': post_list})

首先我們使用 request.GET.get('q') 獲取到用戶提交的搜索關(guān)鍵詞。用戶通過表單 get 方法提交的數(shù)據(jù) Django 為我們保存在 request.GET 里,這是一個類似于 Python 字典的對象,所以我們使用 get 方法從字典里取出鍵 q 對應(yīng)的值,即用戶的搜索關(guān)鍵詞。這里字典的鍵之所以叫 q 是因為我們的表單中搜索框 input 的 name 屬性的值是 q,如果修改了 name 屬性的值,那么這個鍵的名稱也要相應(yīng)修改。

接下來我們做了一個小小的校驗,如果用戶沒有輸入搜索關(guān)鍵詞而提交了表單,我們就無需執(zhí)行查詢,我們給給用戶發(fā)一條錯誤提醒消息,這里使用了 django messages 應(yīng)用,這在 交流的橋梁:評論功能 中講過。然后將用戶重定向到首頁。這里的 redirect 函數(shù)也在那篇教程中講過。

如果用戶輸入了搜索關(guān)鍵詞,我們就通過 filter 方法從數(shù)據(jù)庫里過濾出符合條件的所有文章。這里的過濾條件是 title__icontains=q,即 title 中包含(contains)關(guān)鍵字 q,前綴 i 表示不區(qū)分大小寫。這里 icontains 是查詢表達式(Field lookups),我們在之前也使用過其他類似的查詢表達式,其用法是在模型需要篩選的屬性后面跟上兩個下劃線。Django 內(nèi)置了很多查詢表達式,建議過一遍 Django 官方留個印象,了解每個表達式的作用,以后碰到相關(guān)的需求就可以快速定位到文檔查詢其用途 Field lookups。

此外我們這里從 from django.db.models 中引入了一個新的東西:Q 對象。Q 對象用于包裝查詢表達式,其作用是為了提供復(fù)雜的查詢邏輯。例如這里 Q(title__icontains=q) | Q(body__icontains=q) 表示標(biāo)題(title)含有關(guān)鍵詞 q 或者正文(body)含有關(guān)鍵詞 q ,或邏輯使用 | 符號。如果不用 Q 對象,就只能寫成 title__icontains=q, body__icontains=q,這就變成標(biāo)題(title)含有關(guān)鍵詞 q 且正文(body)含有關(guān)鍵詞 q,就達不到我們想要的目的。

綁定 URL

有了視圖函數(shù)后記得把視圖函數(shù)映射到相應(yīng)了 URL,如下。

blog/urls.py

urlpatterns = [
  # 其他 url 配置
  path('search/', views.search, name='search'),
]

大功告成,在導(dǎo)航欄嘗試輸入一些關(guān)鍵詞,看看效果吧!

當(dāng)然這樣的搜索功能是非常簡略的,難以滿足一些復(fù)雜的搜索需求。編寫一個搜索引擎是一個大工程,好在 django-haystack 這款第三方 app 為我們完成了全部工作。使用它我們可以實現(xiàn)更加復(fù)雜的搜索功能,比如全文檢索、按搜索相關(guān)度排序、關(guān)鍵字高亮等等類似于百度搜索的功能,功能十分強大。當(dāng)然其使用也會復(fù)雜一些,下一篇教程將向大家介紹 django-haystack 結(jié)合 Elasticsearch 搜索引擎的使用方法。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python數(shù)據(jù)結(jié)構(gòu)之圖深度優(yōu)先和廣度優(yōu)先實例詳解

    python數(shù)據(jù)結(jié)構(gòu)之圖深度優(yōu)先和廣度優(yōu)先實例詳解

    這篇文章主要介紹了python數(shù)據(jù)結(jié)構(gòu)之圖深度優(yōu)先和廣度優(yōu)先,較為詳細的分析了深度優(yōu)先和廣度優(yōu)先算法的概念與原理,并給出了完整實現(xiàn)算法,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • 深入了解Python的異常處理機制

    深入了解Python的異常處理機制

    這篇文章主要為大家介紹了Python的異常處理機制,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • Python的Tornado框架異步編程入門實例

    Python的Tornado框架異步編程入門實例

    這篇文章主要介紹了Python的Tornado框架異步編程入門實例,異步編程的思維與普通編程比起來有些不同,需要的朋友可以參考下
    2015-04-04
  • python3 讀寫文件換行符的方法

    python3 讀寫文件換行符的方法

    下面小編就為大家分享一篇python3 讀寫文件換行符的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • python設(shè)置表格邊框的具體方法

    python設(shè)置表格邊框的具體方法

    在本篇文章里小編給大家整理的是關(guān)于python設(shè)置表格邊框的具體方法及相關(guān)代碼,需要的朋友們可以學(xué)習(xí)參考下。
    2020-07-07
  • 三個python爬蟲項目實例代碼

    三個python爬蟲項目實例代碼

    這篇文章主要介紹了三個python爬蟲項目實例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • python不同版本的_new_不同點總結(jié)

    python不同版本的_new_不同點總結(jié)

    在本篇內(nèi)容里小編給大家整理了一篇關(guān)于python不同版本的_new_不同點總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-12-12
  • Python簡易版停車管理系統(tǒng)

    Python簡易版停車管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Python如何實現(xiàn)簡易版停車管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • python 用正則表達式篩選文本信息的實例

    python 用正則表達式篩選文本信息的實例

    今天小編就為大家分享一篇python 用正則表達式篩選文本信息的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • 舉例詳解Python中循環(huán)語句的嵌套使用

    舉例詳解Python中循環(huán)語句的嵌套使用

    這篇文章主要介紹了舉例詳解Python中循環(huán)語句的嵌套使用,是Python入門中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05

最新評論

乐业县| 上林县| 六枝特区| 通州区| 进贤县| 石嘴山市| 含山县| 会理县| 宜兰市| 沙洋县| 稻城县| 班玛县| 三门县| 南召县| 仪陇县| 望谟县| 通州区| 新民市| 侯马市| 武定县| 连州市| 东兴市| 卫辉市| 霞浦县| 扶绥县| 日照市| 莱阳市| 万荣县| 苏尼特右旗| 葫芦岛市| 青阳县| 九江县| 霸州市| 交口县| 镇巴县| 阳西县| 岱山县| 碌曲县| 水富县| 炎陵县| 河北区|