Django简单全文搜索(Django实现搜索功能)

本文转载自简单全文搜索

搜索是一个复杂的功能,但对于一些简单的搜索任务,我们可以使用Django Model 层提供的一些内置方法来完成。现在我们来为我们的博客提供一个简单的搜索功能。

概述

博客文章通常包含标题和正文两个部分。当用户输入某个关键词进行搜索后,我们希望为用户显示标题和正文中含有被搜索关键词的全部文章。整个搜索的过程如下:

  1. 用户在搜索框中输入搜索关键词,假设为 “django” ,然后用户点击了搜索按钮提交其输入的结果到服务器。
  2. 服务器接收到用户输入的搜索关键词 “django” 后去数据库查找文章标题和正文中含有该关键词的全部文章。
  3. 服务器将查询结果返回给用户。

整个过程就是这样,下面来看看 Django 如何实现这些过程。

将关键词提交给服务器

先来回归一下我们的 Django 博客的 Post(文章)模型:

blog/models.pyclass Post(models.Model):# 标题title = models.CharField(max_length=70)# 正文body = models.TextField()# 其他属性...def __str__(self):return self.title

先看到第 1 步,用户在搜索框输入搜索关键词,因此我们要在博客上为用户提供一个搜索表单,HTML表单代码大概像这样:

base.html<form role="search" method="get" id="searchform" action="{% url 'blog:search %}"><input type="search" name="q" placeholder="搜索" required><button type="submit"><span class="ion-ios-search-strong"></span></button>
</form>

用户输入了搜索关键词并点击了搜索按钮后,数据就被发送给了 Django 后台服务器。表单的 action 属性的值为 {% url ‘blog:search’ %}(虽然我们还没有写这个视图函数),表明用户提交的结果被发送给 blog 应用下的 search 视图函数对应的 URL。

查找含有搜索关键词的文章

搜索的功能将由 search 视图函数提供,代码写在 blog/views.py 里:

blog/views.pyfrom django.db.models import Qdef search(request):q = request.GET.get('q')error_msg = ''if not q:error_msg = "请输入关键词"return render(request, 'blog/index.html', {'error_msg': error_msg})
post_list = Post.objects.filter(Q(title__icontains=q)|Q(body__icontains=q))
return render(request, 'blog/index.html', {'error_msg': error_msg,
'post_list': post_list})

首先我们使用request.GET.get('q')获取到用户提交的搜索关键词。用户通过表单 get 方法提交的数据 Django 为我们保存在request.GET 里,这是一个类似于 Python 字典的对象,所以我们使用get方法从字典里取出 q 对应的值,即用户的搜索关键词。这里字典的键之所以叫 q 是因为我们的表单中搜索框 input 的 name 属性的值是 q,如果修改了 name 属性的值,那么这个键的名称也要相应修改。

接下来我们做了一个小小的校验,如果用户没有输入搜索关键词而提交了表单,我们就无需执行查询,我们就在模板中渲染一个错误提示信息。

如果用户输入了搜索关键词,我们就通过filter方法从数据库里过滤出符合条件的所有文章。这里的过滤条件时title__icontains=q,即 title 中包含(contains)关键字 q,前缀 i 表示不区分大小写。这里icontains是查询表达式(Field lookups),我们在之前也使用过其他类似的查询表达式,其用法是在模型需要筛选的属性后面跟上两个下划线。Django 内置了很多查询表达式,建议过一遍 Django 官方留个印象,了解每个表达式的作用,以后碰到相关的需求就可以快速定位到文档查询其用途 Field lookups。

此外我们这里从 from django.db.models 中引入了一个新的东西:Q 对象。Q 对象用于包装查询表达式,其作用是为了提供复杂的查询逻辑。例如这里Q(title__icontains=q)|Q(body__icontains=q)表示标题(title)含有关键词 q 或者 正文(body)含有关键词 q, 逻辑使用|符号。如果不用 Q 对象,就只能写成title__icontains=q,body__icontains=q,这就变成标题(title)含有关键词 q 正文(body)含有关键词 q,就达不到我们想要的目的。

渲染搜索结果

接下来就是渲染搜索结果页面,这里我们复用了 index.html 模板,唯一需要修改的地方就是当有错误信息时,index.html 应该显示错误信息。只需要在文章列表前加个error_msg 模板变量即可:

templates/blog/index.html{% extends 'base.html' %}
{% block main %}{% if error_msg %}<p>{{ error_msg }}</p>{% endif %}{% for post in post_list %}...{% empty %}<div class="no-post">暂时还没有发布的文章!</div>{% endfor %}
{% endblock main %}

绑定 URL

有了视图函数后记得把视图函数映射到相应的 URL,如下:

blog/urls.pyurlpatterns = [path('search/', views.search, name='search')
]

大功告成,在导航栏尝试输入一些关键词,看看效果吧!

当然这样的搜索功能是非常简略的,难以满足一些复杂的搜索需求。编写一个搜索引擎是一个大工程,好在 django-haystack 这款第三方 app 为我们完成了全部工作。使用它我们可以实现更加复杂的搜索功能,比如全文检索、按搜索相关度排序、关键字高亮等等类似于百度搜索的功能,功能十分强大。当然其使用也会复杂一些,下一篇教程将向大家介绍 django-haystack 的使用方法。

本文转载自简单全文搜索

Django简单全文搜索(Django实现搜索功能)相关推荐

  1. 简单音乐播放器html+css+基础vue+含源码,有搜索和播放mv功能,代码可直接复制用。

    题目:html+css+基础vue实现的简单音乐播放器(含源码),有搜索和播放mv功能,代码可直接复制用. 问题描述: 如果vue刚入门,掌握一些基础语法后就可以写一个简单的音乐播放器来练练手~~如果 ...

  2. Django前后端分离实现登录验证码功能

    Django前后端分离实现登录验证码功能 当下最流行最热门的开发方式当属前后端分离开发,分工也更加明确与专注,前端也是越来越难,几天不学习就跟不上节奏,一个月不学习可以好不夸张的说,你已经不适合这个行 ...

  3. 基于Django简单实现一个员工管理系统

    这是Django框架从入门到精通(第四章用户管理)内附源码 文章目录 前言 目录 第一章:初识Django 第二章:Django模板语法 第三章:orm模块 第四章:案例-用户管理 第五章:Form和 ...

  4. 秒懂系列 | 史上最简单的Python Django入门教程

    http://www.cnblogs.com/baiboy/p/django1.html 摘要:Django的学习教程也是分门别类,形式不一.或是较为体系的官方文档,或者风格自由的博客文档,或者偏向实 ...

  5. php搜索文件名,window_Windows7内置搜索如何同时搜索文件名与内容,  Win7的搜索功能效果非常强 - phpStudy...

    Windows7内置搜索如何同时搜索文件名与内容 Win7的搜索功能效果非常强大,不但比WinXP快上许多,而且还能即输即显.不过我们在平时使用的时候大家会发现,Win7搜索只能搜索目录中的文件名,却 ...

  6. 循序渐进Python3(十二) --2--  web框架之django简单实现oracle数据库操作

    在 Django 中构建 Oracle 数据库支持的 Web 应用程序 了解如何配置 Django 以便与 Oracle 数据库交互,并使用 ORM 进行数据库连接.             产能在软 ...

  7. Django简单介绍-基础1

    Django于2003诞生于美国Kansas洲,最初是用来构建在线新闻的后端服务器.Django一词是源自比利时的爵士音乐家Django Reinhardt的名字,意味着Django能开发功能丰富的W ...

  8. python入门教程慕课网_秒懂系列 | 史上最简单的Python Django入门教程

    摘要:Django的学习教程也是分门别类,形式不一.或是较为体系的官方文档,或者风格自由的博客文档,或者偏向实例的解析文档.即使官方文档,章节较多,文字阐述累赘,有时候我们只是关注某个功能用法而已,而 ...

  9. 计算机硬盘搜索记录,硬盘搜索:功能全方位对比 该选谁?

    三.功能对比 3.1 看谁建得快 建立搜索数据库(索引)速度对比 Everything与闪电搜索都是利用了NTFS文件系统的特性(估计是通过直接读取NTFS文件系统的USN日志)来快速建立自己的搜索数 ...

最新文章

  1. opencv4.4.0函数手册_实战 MySQL8.0 窗口函数的巧妙应用
  2. js面试题知识点全解(一作用域)
  3. Laravel报错Failed opening required ‘bootstrap/../vendor/autoload.php‘
  4. ionic overflow:auto失效
  5. CDOJ 486 Good Morning 傻逼题
  6. sklearn自学指南(part41)--使用手册的目录
  7. ROS Kinectic 安装问题
  8. 结构体跨函数应用(二)
  9. uva 1220——Party at Hali-Bula
  10. 如果程序员想从事网络营虚拟光驱
  11. Think in Java第四版 读书笔记7第13章 字符串
  12. python构造自定义数据包_pytorch中的自定义数据处理详解
  13. Sql Server2005 Transact-SQL 新兵器学习总结之-PIVOT和UNPIVOT运算符
  14. 如果不当程序员,我可以生活的更好么?
  15. [转载] Python图结构(复杂网络)可视化模块——networkx
  16. CH32F103与STM32F103在USB接口上的差异与使用
  17. 实现网站二维码扫描登录
  18. 百度指数 数据分析(介绍)
  19. C程序-超简单的猜数字-游戏
  20. 率土之滨鸿蒙团,【率土之滨】无需“垒实”也能鏖战全场!群吕布混编弓解析...

热门文章

  1. Python每日一练-----妈妈找小蝌蚪(哈希算法)
  2. 《Java黑皮书基础篇第10版》 第2章【笔记】
  3. 去图片水印软件有哪些?安利这几个实用的工具给你们
  4. Matlab部署web端app(一)
  5. Mysql添加用户与授权
  6. Nacos Spring Cloud入门
  7. 创新工场涂鸦移动2018校园招聘测试题
  8. 解决Android Studio全局搜索搜不到结果的问题
  9. abap数据类型转换_ABAP数据转换规则
  10. Drools规则属性,高级语法