django 实现简单的搜索功能

  • 1 年,1 月前
  • 4849 字
  • 13259 阅读
  • 7 评论

搜索是一个复杂的功能,但对于一些简单的搜索任务,我们可以使用 django model 层提供的一些内置方法来完成。本文将结合 django 模型管理器的 filter 方法和 icontains 查询表达式来实现一个简单的搜索功能。

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

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

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

假设我们的 django 博客应用有如下的文章模型:

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

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

<form method="get" action="/search/">{% csrf_token %}<input type="search" placeholder="搜索" required><button type="submit">搜索</button>
</form>

特别注意在 form 标签下有一个 {% csrf_token %},这是 django 用来防御跨站请求伪造(CSRF)攻击的机制。如果不知道什么是 CSRF 的话也没有关系,只要记住在使用 django 时,前端的表单代码里一定要加上 {% csrf_token %}

用户输入了搜索关键词并点击了搜索按钮后,数据就被发送给了 django 后台服务器。表单的 action 属性的值为/search/,表明用户提交的结果将被发送给 /search/ 这个 URL。我们为这个 URL 绑定一个 django 视图函数,在这个视图函数里完成前面第 2 步提到的过程。假设我们把视图函数的代码写在 blog/views.py 里:

blog/views.pydef search(request):q = request.GET.get('q')error_msg = ''if not q:error_msg = '请输入关键词'return render(request, 'blog/errors.html', {'error_msg': error_msg})post_list = Post.objects.filter(title__icontains=q)return render(request, 'blog/results.html', {'error_msg': error_msg,'post_list': post_list})

首先我们使用 request.GET.get('q') 获取到用户提交的搜索关键词。用户通过表单提交的数据 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

接下来就是渲染搜索结果页面,显示符合搜索条件的文章列表,下面是一个模板的简单示例:

results.html{% if error_msg %}<p>{{ error_msg }}</p>
{% endif %}{% for post in post_list %}<div>在这里显示文章的相应信息</div>
{% empty %}<div class="no-post">没有搜索到符合条件的文章</div>
{% endfor %}

有了视图函数后记得把视图函数映射到相应了 URL,前面我们表单数据提交的 URL 为 /search/,因此将视图函数search 绑定到该 URL 上。

blog/urls.pyurlpatterns = [# 其他 url 配置url(r'^search/$', views.search, name='search'),
]

大功告成!


以上示例写的比较通用,并不是针对某个具体项目。但如果你稍微了解一点 django 的话,肯定能够看懂文章的内容,并且稍作修改就能应用于自己的项目。如果你对 django 还不是很了解,这里有一篇从零开始学习 django 的入门指南,能够帮助你找到高质量的学习教程,以最快的速度入门 django 开发:django 入门学习规划与资料推荐。

也许你前面已经学习了 django 博客开发入门教程,针对这个教程里的具体项目,我们修改上述代码的一些细节,就可以在项目里顺利运行。

首先是修改表单,打开 templates/base.html,在 header 标签里找到搜索表单部分的代码并修改,即添加 {% csrf_token %} 模板标签、修改搜索框的 name 属性和表单的 action 属性:

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

然后是编写视图函数:

blog/views.pydef 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(title__icontains=q)return render(request, 'blog/index.html', {'error_msg': error_msg,'post_list': post_list})

这里我们直接渲染了 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:

blog/urls.pyurlpatterns = [# 其他 url 配置url(r'^search/$', views.search, name='search'),
]


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

django 实现简单的搜索功能相关推荐

  1. 用PHP做一个简单的搜索功能

    用PHP做一个简单的搜索功能 说到搜索,大家最熟悉不过了.当你想知道某个东西,某件事,你也许会刻意搜索它,而搜索作为一项基本的用户必备工具,它有着庞大的知识库,通过各种联动技术,当你输入想要了解的关键 ...

  2. Android简单实现搜索功能 显示清除历史搜索记录

    本文主要为大家分享了Android实现搜索功能,并且可以实时显示搜索的历史记录,根据输入的内容去模糊查询,供大家参考,界面图如下. 本案例实现起来也非常的简单,所以可以直接拿来嵌入项目中使用,主要涉及 ...

  3. Django + DRF + Elasticsearch 实现搜索功能

    django使用haystack来调用Elasticsearch搜索引擎 如何使用django来调用Elasticsearch实现全文的搜索 Haystack为Django提供了模块化的搜索.它的特点 ...

  4. Django建立博客搜索功能(haystack+whoosh+jieba)

    0-效果预览 1-相关说明: haystack 全文检索框架,可配置各种搜索引擎,在Django内相当于app whoosh 搜索引擎 2-whoosh下载与优化 中文分词jieba 下载: pip ...

  5. vue使用filter过滤器实现简单的搜索功能

    // filter来筛选新数组,至于具体怎么去使用就看你要实现什么功能 data() {return {list: [{id: '1', name: 'AAA'},{id: '2', name: 'B ...

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

    Django简单全文搜索(Django实现搜索功能) 本文转载自简单全文搜索 搜索是一个复杂的功能,但对于一些简单的搜索任务,我们可以使用Django Model 层提供的一些内置方法来完成.现在我们 ...

  7. python discuz搜索api_Django用内置方法实现简单搜索功能的方法

    Model中分别提供了filter方法和icontains方法实现简单的搜索功能. html页面中实现搜索框 模板api_test_manage.html中增加以下内容 {% csrf_token % ...

  8. Java Web简单搜索功能实现

    小demo,没有使用框架. webapp项目,用到了servlet + jsp,使用jdbc从MySQL中查询数据 构建工具maven 先上截图 pom.xml 注意版本问题! <propert ...

  9. 【ElasticSearch和whoosh实现项目中搜索功能】

    文章目录 说明: 一.单表搜索 二,全局搜索 方式一:haystack+whoosh+Jieba 方式二:haystack+ES 总结: 说明: 我们的项目中经常会遇到搜索的功能,最近也写过搜索的功能 ...

最新文章

  1. linux 命令详解 二十七
  2. Verilog随机数生成$random
  3. 卷积转换为矩阵运算中填充数的计算-GEMM
  4. a b*c的C语言表达式为,在C语言的if语句中,用作判断的表达式为 ______
  5. c语言输入若干数输出最小值循环结构,C语言上机150道题
  6. webpack轻松入门教程
  7. 二级mysql教程下载_全国计算机等级考试教程:二级MySQL数据库程序设计
  8. 中国移动也要办电竞大赛了!联合腾讯网易办首届电竞大赛
  9. 20200729:力扣199周周赛题解(下)
  10. 2021-6-25 组态王与modbus rtu从机STM32精英开发板通信
  11. C语言 统计元音字母个数
  12. SpringApplicationBuilder
  13. mysql数据库编程题题_mysql数据库编程题测试
  14. ESD/EMI防护设计
  15. centos下如何查看磁盘使用情况命令
  16. OpenGL3.3transform feedback再理解
  17. Android Log 机制
  18. CorelDRAW文件损坏的几种解决方法
  19. 什么是网络运维工程师? 就业前景好吗?
  20. PCB喷锡工艺简要总结

热门文章

  1. 吴佳昌//2018.7.10
  2. Pyrene-PEG-Azide仅用于科学研究,MW:5000
  3. 表单控件 文本框 title overall type: UNKNOWN_TYPE server type: NO_SERVER_DATA
  4. DPVS适配博通100G网卡
  5. 马云最新透露:教你没钱如何创业,抓住这个商机你将成为最大赢家
  6. 接口报错500是什么意思_500 系统错误.请等待的翻译是:什么意思
  7. 中国移动MM7 API用户手册(五)
  8. 服务器可以放在家里吗一定要放在机房托管吗
  9. 奋斗吧,程序员——第二十七章 鸿雁在云鱼在水,惆怅此情难寄
  10. 求100000000!末尾有多少个0