Django-haystack插件实现

项目地址:https://github.com/ylpxzx/lifeblog

步骤

  1. 安装依赖包
pip install whoosh,jieba,django-haystack# 尽量采用其他源的pip进行安装,比如
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple django-haystack
  1. 将haystack加入INSTALLED_APPS
INSTALLED_APPS = ['django.contrib.admin',...'post','haystack',   #添加该行
]
  1. 在需要搜索的应用app下创建search_indexes.py,如在post应用下。
from haystack import indexes
from .models import Post# 类名的命名规则是固定的,严格按照“应用名+Index”
class PostIndex(indexes.SearchIndex, indexes.Indexable):text = indexes.CharField(document=True, use_template=True,template_name='search/indexes/post/post_text.txt')def get_model(self):return Postdef index_queryset(self, using=None):return self.get_model().objects.all()
  1. 将site-packages/haystack/backends/whoosh_backend.py复制到应用app下,并更名为whoosh_cn_backend.py

  2. 在settings.py中设置haystack配置

# 配置搜索设置
HAYSTACK_CONNECTIONS = {'default': {'ENGINE': 'post.whoosh_cn_backend.WhooshEngine',  # post应用下的whoosh_cn_backend.py文件'PATH': os.path.join(BASE_DIR, 'whoosh_index'),  # 指定了索引文件需要存放的位置,我们设置为项目根目录 BASE_DIR 下的 whoosh_index 文件夹(在建立索引时会自动创建)。},
}
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 6  # 指定如何对搜索结果分页,这里设置为每 6 项结果为一页。
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'  # 指定什么时候更新索引,这里我们使用 haystack.signals.RealtimeSignalProcessor,作用是每当有文章更新时就更新索引。由于博客文章更新不会太频繁,因此实时更新没有问题。
  1. 创建template/search/indexes/app_name/model_text.txt文件,建立指定的字段索引
# 如:创建template/search/indexes/post/post_text.txt
{{ object.title }}
{{ object.content }}
  1. 创建索引,自动生成whoosh_index文件夹
# 创建索引
python manage.py rebuild_index  # 输入y即可# 更新索引
python manage.py update_index
  1. 在应用app的views.py下继承SearchView
from haystack.views import SearchView
from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger
from django.conf import settings
from django.shortcuts import render,redirect
from django.db.models import Q
class MySearchIndex(SearchView):# template = 'search.html'def extra_context(self):context = super(MySearchIndex,self).extra_context()context['category_list'] = Category.objects.all().order_by('post_category')context['popular_post'] = Post.objects.all().order_by('-total_views')[:4]return contextdef create_response(self):if self.request.GET.get('q'):# print("进入not self.request")keyword = self.request.GET.get('q')# post_info = Post.objects.filter(title__contains=keyword)post_info = Post.objects.filter(Q(title__icontains=keyword)|Q(content__icontains=keyword)).order_by("id")  # 搜索标题和文章内容# post_info = Post.objects.all()paginator = Paginator(post_info, settings.HAYSTACK_SEARCH_RESULTS_PER_PAGE)try:page = paginator.page(int(self.request.GET.get('page', 1)))except PageNotAnInteger:page = paginator.page(1)except EmptyPage:page = paginator.page(paginator.num_pages)context = {'query': self.query,'form': self.form,'page': page,'paginator': paginator,'suggestion': None,}context.update(self.extra_context())return render(self.request, self.template, context)else:qs = super(MySearchIndex, self).create_response()# print(self.get_context())return qs
  1. 在应用urls下配置路由
url(r'^search/$', MySearchIndex(), name='haystack_search'),
  1. 创建template/search/search.html文件
{% extends 'index.html' %}
{% block Banner %}{% endblock %}{% block area %}<div class="col-lg-8"><div class="blog_left_sidebar"><div class="row">{% for post in page.object_list %}<div class="col-md-6"><article class="blog_style1 small"><div class="blog_img"><img class="img-fluid" style="height: 280px;" src="/media/{{ post.cover }}" alt=""></div><div class="blog_text"><div class="blog_text_inner"><div class="cat"><a class="cat_btn" href="#">{{ post.category }}</a><a href="#"><i class="fa fa-calendar" aria-hidden="true"></i> {{ post.create_time|date:"Y-m-d" }}</a><a href="#"><i class="fa fa-comments-o" aria-hidden="true"></i> 05</a></div><a href="{% url 'post:detail' post.id %}" ><h4>{{ post.title }}</h4></a><p>{{ post.short_detail|safe }}</p><a class="blog_btn" href="{% url 'post:detail' post.id %}">Read More</a></div></div></article></div>{% empty %}<h3>没有找到相关文章</h3>{% endfor %}</div><!-- 分页栏 --><nav class="blog-pagination justify-content-center d-flex"><ul class="pagination">{% if page.has_previous %}<li class="page-item"><a href="{% url 'post:haystack_search' %}?q={{ query }}&page={{ page.previous_page_number }}" class="page-link" aria-label="Previous"><span aria-hidden="true"><span class="lnr lnr-chevron-left"></span></span></a></li>{% else %}<li class="page-item"><a href="#" class="page-link" aria-label="Previous"><span aria-hidden="true"><span class="lnr lnr-chevron-left"></span></span></a></li>{% endif %}{% for num in page.paginator.page_range %}{% if num == page.number %}<li class="page-item active"><a href="{% url 'post:haystack_search' %}?q={{ query }}&page={{ num }}" class="page-link">{{ num }}</a></li>{% else %}<li class="page-item"><a href="{% url 'post:haystack_search' %}?q={{ query }}&page={{ num }}" class="page-link">{{ num }}</a></li>{% endif %}{% endfor %}{% if page.has_next %}<li class="page-item"><a href="{% url 'post:haystack_search' %}?q={{ query }}&page={{ page.next_page_number }}" class="page-link" aria-label="Next"><span aria-hidden="true"><span class="lnr lnr-chevron-right"></span></span></a></li>{% else %}<li class="page-item"><a href="#" class="page-link" aria-label="Next"><span aria-hidden="true"><span class="lnr lnr-chevron-right"></span></span></a></li>{% endif %}</ul></nav></div></div>
{% endblock %}

网上示例需要在字段选取中间加个object,如:

<p>{{ post.object.short_detail|safe }}</p>

项目文件结构


异常解决

  • ImportError: cannot import name ‘six’ from ‘django.utils’
  1. 安装six
pip install six
  1. 将six.py复制到django/utils

文件路径

site-packages/six.py

site-packages/django/utils

  • ImportError: cannot import name python_2_unicode_compatible
  1. 报错位置导入的包替代为以下导入语句
from django.utils.six import python_2_unicode_compatible

Django简单博客实战(六)---搜索功能相关推荐

  1. HEXO博客系统添加搜索功能

    Hexo 可以通过接入第三方搜索引擎来为博客添加搜索功能.这里给出一种基于 Algolia 搜索引擎的实现方式. 流程 Algolia 是一家搜索解决方案提供商,提供强大的搜索服务和 API 接口.在 ...

  2. Django个人博客开发 | 前言

    本渣渣不专注技术,只专注使用技术,不是一个资深的coder,是一个不折不扣的copier 1.前言 自学 Python,始于 Django 框架,Scrapy 框架,elasticsearch搜索引擎 ...

  3. Django实现简单博客系统

    Django实现简单博客系统 第一节 - 基础 1. 简单的导览图,学会不迷路 2. 基本操作介绍 3. 命令简单介绍 4. mysite:所建项目的管理功能目录 5. blog:我们创建的项目之一 ...

  4. Django by Example·第二章|Enhancing Your Blog with Advanced Features(为博客系统添加高级功能)@笔记

    Django by Example·第二章|Enhancing Your Blog with Advanced Features(为博客系统添加高级功能)@笔记 这本书的结构确实很不错,如果能够坚持看 ...

  5. 博客导航——一站式搜索(所有博客的汇总帖)

    博客导航--一站式搜索 以后博客肯定会越来越多的,所以这做一个整理,方便各位朋友能快速的锁定自己想要的资源 课程 巧用第三方快速开发Android App 热门第三方SDK及框架 Android St ...

  6. Django搭建博客网站(2)

    10.页面侧边栏:使用自定义模板标签 我们的博客侧边栏有四项内容:最新文章.归档.分类和标签云.这些内容相对比较固定,且在各个页面都会显示,如果像文章列表或者文章详情一样,从视图函数中获取然后传递给模 ...

  7. 基于Django的博客系统

    代码地址如下: http://www.demodashi.com/demo/14445.html 基于django的博客系统, 界面展示 首页前端界面如下: 文章页面: 后台页面: 文章页面: ##项 ...

  8. Python Flask框架-开发简单博客-认证蓝图

    作者:Eason_LYC 悲观者预言失败,十言九中. 乐观者创造奇迹,一次即可. 一个人的价值,在于他所拥有的.可以不学无术,但不能一无所有! 技术领域:WEB安全.网络攻防 关注WEB安全.网络攻防 ...

  9. 基于Django的博客兼学术主页管理网站

    基于Django的博客兼学术主页管理网站 摘要: 本系统基于后端Django框架和前端HTML页面,使用MVT设计模式构建了博客兼学术主页管理网站.该网站具有编写博客.阅读博客.点赞评论其他人博客的博 ...

最新文章

  1. nginx技术(2)nginx的配置详解
  2. mysql什么级别数据库_Mysql的四种隔离级别是什么
  3. 电脑已经连上网却显示没网图标小地球,导致国际游戏暴雪等软件无法运行(已解决)
  4. 如何获取租户中所有的Team
  5. (延迟两秒,跳转相应页面)(返回到上一个页面并刷新)
  6. 计算机专业实践试题,计算机专业实践综合试题答案..doc
  7. STM32工作笔记0013---认识UCOS系统
  8. 随想录(OllyDbg和IDA Pro的配合使用)
  9. TED如何和压力做朋友(第三天)
  10. 电气防火限流式保护器应用场景及选型指南
  11. 华为安装gsm框架_华为mate30怎么安装谷歌服务?华为mate30系列安装GMS框架图文教程...
  12. 8产权界定_保护与限制
  13. 硬件加速原理分析探索
  14. 感人!华为员工累死,同事模仿鲁迅写《纪念胡新宇君》(转贴)
  15. SpringCloud(part10)Spring Data 与JPA,MongoDB,Redis
  16. arcgis 根据坐标定位
  17. 顶点计划1——信通2018级学生上早自习缺勤率情况分析
  18. 你适不适合做UE交互设计师
  19. 一文搞懂积分不等式证明(积分证明题总结笔记3/3)
  20. 伪代码基本规范~呦呦呦

热门文章

  1. Java---抽象类和接口
  2. 还记得“有情怀”的游侠吗?这次挂了个宝宝准备放大招
  3. python全栈开发基础学习过程笔记【18d】os模块
  4. 风扇UL507测试报告怎么办理?在亚马逊用的
  5. 电子商务网站之产品页
  6. word自动生成目录左对齐(缩进)问题
  7. 四、采集和制作数据集
  8. 口琴膜片什么作用_半音阶口琴拍膜是什么
  9. try…catch…finally异常处理的组合方式
  10. linux普通用户tcp最大连接数查询,如何测试Linux下tcp最大连接数限制详解