1. 程式人生 > >潭州課堂25班:Ph201805201 django 專案 第二十八課 新聞elasticsearch搜尋前後功臺能實現 (課堂筆記)

潭州課堂25班:Ph201805201 django 專案 第二十八課 新聞elasticsearch搜尋前後功臺能實現 (課堂筆記)

後端功能實現

檔案,類,欄位,命名不要改動, 

在apps/news/search_indexes.py中建立如下類:(名稱固定為search_indexes.py)

# -*-# -*- coding: utf-8 -*-
# 斌彬電腦
# @Time : 2018/10/12 0012 8:47

from haystack import indexes
# from haystack import site
from .models import News


class NewsIndex(indexes.SearchIndex, indexes.Indexable):
    """
    News索引資料模型 類
    """
    text = indexes.CharField(document=True, use_template=True)
    id = indexes.IntegerField(model_attr='id')
    title = indexes.CharField(model_attr='title')
    digest = indexes.CharField(model_attr='digest')
    content = indexes.CharField(model_attr='content')
    image_url = indexes.CharField(model_attr='image_url')
    # comments = indexes.IntegerField(model_attr='comments')

    def get_model(self):
        """
        返回建立索引的模型類
        """
        return News

    def index_queryset(self, using=None):
        """
        返回要建立索引的資料查詢集
        :param using:
        :return:
        """
        # 條件:把未被邏輯刪除的,進行搜尋
        return self.get_model().objects.filter(is_delete=False, tag_id=1)
        # return self.get_model().objects.filter(is_delete=False, tag_id__in=[1, 2, 3, 4, 5, 6])

  

後臺檢視

from haystack.views import SearchView as _SearchView


class SearchView(_SearchView):
    # 模版檔案
    template = 'news/search.html'

    # 重寫響應方式,如果請求引數q為空,返回模型News的熱門新聞資料,否則根據引數q搜尋相關資料
    def create_response(self):
        kw = self.request.GET.get('q', '')
        if not kw:
            show_all = True
            hot_news = models.HotNews.objects.select_related('news'). \
                only('news__title', 'news__image_url', 'news__id'). \
                filter(is_delete=False).order_by('priority', '-news__clicks')

            paginator = Paginator(hot_news, settings.HAYSTACK_SEARCH_RESULTS_PER_PAGE)
            try:
                page = paginator.page(int(self.request.GET.get('page', 1)))
            except PageNotAnInteger:
                # 如果引數page的資料型別不是整型,則返回第一頁資料
                page = paginator.page(1)
            except EmptyPage:
                # 使用者訪問的頁數大於實際頁數,則返回最後一頁的資料
                page = paginator.page(paginator.num_pages)
            return render(self.request, self.template, locals())
        else:
            show_all = False
            qs = super(SearchView, self).create_response()
            return qs