zoukankan      html  css  js  c++  java
  • 潭州课堂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
    

      

    在apps/news/urls.py中

    urlpatterns = [
    path('search/', views.SearchView(), name='search'),

    ]

    创建templates/search/indexes/news/news_text.txt文件(文件名为:应用名_text.txt)

    {{ object.title }}
    {{ object.digest }}
    {{ object.content }}

    templates/search/indexes,为固定路径,不可更改,

     /news/news_text.txt 与应用名,模型名相关,

     把要搜索的字段,填入该文件中,

    手动创建 索引表:

    进入虚拟环境:

    workon mayun

    进入到项目:

    cd myblog/
    (mayun) binbin@abc:~/myblog/myblog$ ls
    a apps db.sqlite3 __init__.py logs manage.py media myblog MyBlog_Static templates utils

    重建索引: python manage.py rebuild_index

    执行命令:

    python manage.py haystack_info

    会帮我们创建索引表:

    Number of handled 1 index(es).
    - Model: News by Index: <apps.news.search_indexes.NewsIndex object at 0x7f8b99c5fb88>

    手动更新: python manage.py update_index

  • 相关阅读:
    从前端回到了我的本专业网络
    相对定位与绝对定位的理解
    table( 表格)以及列表的使用
    使用editplus编写HTML页面为什么设置了UTF-8仍然中文乱码
    复习--3--对于第三堂课的总结--将两个页面相互用超链接链接到一起
    前端学习笔录--2--HTML篇--有点麻烦的加载图片
    前端学习笔录--1--HTML篇
    sublime text 有毒--无法使用快捷键利用浏览器打开HTML文件
    sublime text 插件
    sublime写网页代码,里面的中文字符会出现乱码
  • 原文地址:https://www.cnblogs.com/gdwz922/p/10188471.html
Copyright © 2011-2022 走看看