網站搭建 (第13天) 全文搜索
阿新 • • 發佈:2019-05-14
hvie context 函數 html模板 class rec htm del tex
一、前言
關於全文搜索的部分,主要是利用了haystack,whoosh和jieba這三個包,而且必須安裝,否則以下內容無效。詳細的說法已經在之前Django框架的學習內容中總結過了:Django 框架15: 全文搜索。
這次繼續學習全文搜索的內容主要是因為在之前的內容中,缺少了自定義全文搜索部分。因為在後來的開發中,我發現搜索頁的結果只有在blog_text.txt中出現過的字段名。如果我想繼續如博客列表那樣顯示出榜單排行就無法實現了,因為search.html模板頁面不會經過自定義的views,所以就必須采用某種辦法可以實現自定義某種context參數傳遞到search.html模板頁面中。
二、使用方法
幸運的是,haystack的views提供了extra_context這種接口,通過繼承SearchView類,就可以重寫該方法。
def extra_context(self): """ Allows the addition of more context variables as needed. Must return a dictionary. """ return {}
首先,編寫一個MySeachView類,讓它繼承SearchView類。
from haystack.views import SearchView from read_statistics.utils import get_random_recomment, get_new_recommend_post, get_all_read_posts from django.contrib.contenttypes.fields import ContentType from .models import Post from django.core.paginator import * # 導入分頁功能 from blogproject.settings import * class MySeachView(SearchView): """ 作用:自定義的search視圖 SearchView:繼承SearchView類 """ def extra_context(self): # 重載extra_context來添加額外的context內容 """ 添加自定義的context參數,傳遞到search.html視圖 :return: 自定義的context參數 """ context = super(MySeachView, self).extra_context() # 這裏的EACH_RAGE_BLOG_NUMBER等於10,已經當成常量寫進了seetings裏 paginator = Paginator(self.results, EACH_RAGE_BLOG_NUMBER) # 采用get方式獲取用戶訪問的頁碼,如果獲取不到,默認為第一頁 page_num = self.request.GET.get(‘page‘, 1) # 因為用戶輸入不一定是數字,所以需要用int(page_num),而django裏的get_page會自動識別用戶輸入以及頁碼範圍 # 註意這裏的page_of_list是一個paginator對象 page_of_list = paginator.page(int(page_num)) # 獲取當前頁碼 current_page_num = page_of_list.number # page_range = [current_page_num - 2, current_page_num - 1, # current_page_num, current_page_num + 1, current_page_num + 2] # 獲取當前頁碼前後各兩頁的頁碼範圍 # 需要註意判斷的是:如果當前頁是第一頁,那麽前兩頁不能是0,也不能是-1,所以要使用內置max函數來與1比較最大值 # 同理:如果當前頁已經是最後一頁,那麽就不能取到當前頁+2的頁碼了,所以要使用內置min函數來與最大頁碼比較最小值 page_range = list(range(max(current_page_num - 2, 1), current_page_num)) + list(range(current_page_num, min(current_page_num + 2, paginator.num_pages) + 1)) # 加上省略頁碼標記 # paginator.num_pages表示一共有多少頁碼 if page_range[0] - 1 >= 2: page_range.insert(0, ‘...‘) if paginator.num_pages - page_range[-1] >= 2: page_range.append(‘...‘) # 加上首頁尾頁 # paginator.num_pages表示一共有多少頁碼 if page_range[0] != 1: page_range.insert(0, 1) if page_range[-1] != paginator.num_pages: page_range.append(paginator.num_pages) # 隨機推薦的15篇博客 random_recommend = get_random_recomment() # 最新推薦的15篇博客 post_content_type = ContentType.objects.get_for_model(Post) new_recommend = get_new_recommend_post(post_content_type) # 閱讀量總榜博客榜單 all_hot_posts = get_all_read_posts() context = { ‘page_range‘: page_range, ‘random_recommend‘: random_recommend, ‘new_recommend‘: new_recommend, ‘all_hot_posts‘: all_hot_posts, } return context
如上可以看到,我已經新加了一些參數放到了context裏面,然後把該類添加到項目的url中。
url(r‘^search/‘, MySeachView(), name=‘haystack_search‘),
最後修改search.html模板就可以完全實現自定義的搜索頁的視圖功能了。
原文出處:https://jzfblog.com/detail/96,文章的更新編輯以此鏈接為準。歡迎關註源站文章!
網站搭建 (第13天) 全文搜索