個人網站搭建 (第十三天) 自定義全文搜索

    關於全文搜索的部分,主要是利用了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

相關文章
相關標籤/搜索