1. 程式人生 > >網站搭建 (第13天) 全文搜索

網站搭建 (第13天) 全文搜索

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天) 全文搜索