關於全文搜索的部分,主要是利用了haystack,whoosh和jieba這三個包,並且必須安裝,不然如下內容無效。詳細的說法已經在以前Django框架的學習內容中總結過了:Django 框架15: 全文搜索html
此次繼續學習全文搜索的內容主要是由於在以前的內容中,缺乏了自定義全文搜索部分。由於在後來的開發中,我發現搜索頁的結果只有在blog_text.txt中出現過的字段名。若是我想繼續如博客列表那樣顯示出榜單排行就沒法實現了,由於search.html模板頁面不會通過自定義的views,因此就必須採用某種辦法能夠實現自定義某種context參數傳遞到search.html模板頁面中python
幸運的是,haystack的views提供了extra_context這種接口,經過繼承SearchView類,就能夠重寫該方法django
def extra_context(self): """ Allows the addition of more context variables as needed. Must return a dictionary. """ return {}
1.首先,編寫一個MySeachView類,讓它繼承SearchView類app
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
2.如上能夠看到,我已經新加了一些參數放到了context裏面,而後把該類添加到項目的url中框架
url(r'^search/', MySeachView(), name='haystack_search'),
3.最後修改search.html模板就能夠徹底實現自定義的搜索頁的視圖功能了dom