文章目录

  • 1. 概述
  • 2. 模板:将关键词提交给服务器
  • 3. 视图:查找含有搜索关键词的文章
  • 4. 视图:绑定 URL

1. 概述

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

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

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

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

2. 模板:将关键词提交给服务器

在博客上为用户提供一个搜索表单,HTML 表单代码大概像这样:

文件位置:templates/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>

特别注意这里 中的 name 属性,当用户在这个 input 中输入搜索内容并提交表单后,键入的数据会以键值对的形式提交服务器,这个键的名字就是通过 name 属性指定的。这样服务器就可以根据 name 的值来取得用户输入的内容。

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

3. 视图:查找含有搜索关键词的文章

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

文件位置:blog/views.py


from django.contrib import messagesdef search(request):q = request.GET.get('q')if not q:error_msg = "请输入搜索关键词"messages.add_message(request, messages.ERROR, error_msg, extra_tags='danger')return redirect('blog:index')post_list = Post.objects.filter(Q(title__icontains=q) | Q(body__icontains=q))return render(request, 'blog/index.html', {'post_list': post_list})

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

接下来我们做了一个小小的校验,如果用户没有输入搜索关键词而提交了表单,我们就无需执行查询,我们给用户发一条错误提醒消息,这里使用了 django messages 应用,这在 交流的桥梁:评论功能 中讲过。然后将用户重定向到首页。这里的 redirect 函数也在那篇教程中讲过。

如果用户输入了搜索关键词,我们就通过 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,就达不到我们想要的目的。

4. 视图:绑定 URL

有了视图函数后记得把视图函数映射到相应了 URL,如下。
文件位置:blog/urls.py

urlpatterns = [# 其他 url 配置path('search/', views.search, name='search'),
]

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

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

Diango博客--21.实现简单的全文搜索相关推荐

  1. Diango博客--25.使用Coverage统计测试覆盖率

    文章目录 1. 前言 2. 安装 Coverage 3. 简单配置 Coverage 4. 运行 Coverage 5. 完善 Coverage 配置 6. 生成 HTML 报告 7. 完善单元测试 ...

  2. Asp.net MVC 仿照博客园的简单网站首页 列表设计

    本来我打算采用ajax提交请求,异步的请求获取数据,但是我发现如果这样的话就会拖慢开发的进度,拖长时间.所以在这篇博客中仿照首页的列表设计其实和左侧列表网站分类采用了同样的方式,通过局部视图的方式呈现 ...

  3. 专心写博客21天,我拿到了博客专家

    专心写博客21天,我拿到了博客专家   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地址为:亓官劼的博客,亓官劼的博客2. s 不好意 ...

  4. 单机 docker 部署fastfds_云服务器使用docker可视化一键部署Wrodpress个人博客,操作简单,适合小白...

    原文链接在我的博客: 教你云服务器使用docker可视化一键部署Wrodpress个人博客,操作简单,适合小白 - Kyellow's blog​kyellow.gitee.io 前段时间领取了一台云 ...

  5. github+hexo搭建个人博客(1.简单搭建)

    github+hexo搭建个人博客(1.简单搭建) 需要使用的软件,我已经放到自己的百度云盘里,网络不好的同学可以自己下载[百度云链接] 安装git 安装node 安装hexo 本地测试 申请gith ...

  6. Hexo博客搭建之Next主题添加搜索服务

    随着时间的推移,我们博客站点上的文章会越来越多,因此在站点中增加一个文本搜索服务是非常有必要的.本文介绍一种添加站内搜索服务的方法,站点配置基于 Hexo5.4.2 博客和 Next 主题. Algo ...

  7. Diango博客--15.通过 Django Pagination 实现简单分页(一)

    文章目录 0.思路引导 1.Paginator 类的常用方法 2.用 Paginator 给文章列表分页 3.在模板中设置分页导航 4.效果展示 0.思路引导 1)当博客上发布的文章越来越多时,通常需 ...

  8. CSDN如何快速转载别人的博客(附简单详细方法)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/ProgramChangesWorld/ ...

  9. Diango博客--23.单元测试:测试 blog 应用

    文章目录 1. 前言 2. 搭建测试环境 3. 测试模型 4. 测试视图 5. 测试模板标签 6. 测试辅助方法和类 1. 前言 我们博客功能越来越来完善了,但这也带来了一个问题,我们不敢轻易地修改已 ...

最新文章

  1. 用30行代码做一个微信智障机器人
  2. 记一次用pip安装docker-compose报错及解决方法
  3. php读取mysql分页查询
  4. 计算机组装报告文档,计算机组装报告.doc.docx
  5. 爬虫-大招-自动化测试工具上演
  6. 用开源代码如何建立网站_糖尿病患者找到开源并建立自己的医疗设备
  7. 一文看懂BGP路由黑洞问题
  8. 基本文件管理,针对Centos7的XFS文件系统备份恢复(需要更改)
  9. VS2008启动调试,出现“ 已经找到网站 正在等待回应”
  10. 计算机维修与数据恢复论文,备份恢复论文,关于计算机数据备份数据恢复技术相关参考文献资料-免费论文范文...
  11. 共模信号和差模信号的区别和抑制
  12. 一个“小把戏”“哄得”小朋友挺满意
  13. ROS2极简总结-文件系统
  14. python第三方库matplotlib绘制简单折线图
  15. 回溯法求地图填色实验(剪枝)
  16. android的apk加壳工具对比
  17. Android textview设置ttf字体库本地库和网络库使用的两种方式
  18. 【温故而知新】分布式系统(一)
  19. 微博数据采集API 附咨询公司微博大数据分析实例
  20. 仿射密码的加密与解密

热门文章

  1. web3 0.2.x 和 1.x.x版本之间的差异
  2. MSYS2 + MinGW-w64 + Git + gVim 环境配置
  3. Python Matplotlib.plot Update image Questions
  4. 【BZOJ 4169】 4169: Lmc的游戏 (树形DP)
  5. Luogu P3975 [TJOI2015]弦论
  6. 在 PowerPoint 2016 中嵌入网页
  7. hibernate连接数据库配置
  8. 避免流量高峰期CDN问题的10个方法
  9. phpstudy中的mysql
  10. vaOJ10369 - Arctic Network