问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

django如何做全局搜索(2023年最新整理)

发布网友 发布时间:2024-09-29 09:52

我来回答

1个回答

热心网友 时间:2024-10-23 14:50

导读:本篇文章首席CTO笔记来给大家介绍有关django如何做全局搜索的相关内容,希望对大家有所帮助,一起来看看吧。

django如何实现搜索功能并分页每页最多5条数据

列表分页不要想复杂了,本质上来说,分为两部分,界面操作和数据库查询。

数据库查询,仅仅在查询的时候,加入分片,从第几个到第几个就行了

界面操作做好链接就行,这样比你去用django自带的分页方便多了,还更符合你自己的实际需求

求助django实现前端页面检索功能的代码

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

blog/models.pyclassPost(models.Model):

#标题

title=models.CharField(max_length=70)

#正文

body=models.TextField()

#其他属性

def__str__(self):

returnself.title

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

formmethod="get"action="/search/"

{%csrf_token%}inputtype="search"placeholder="搜索"required

buttontype="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.pydefsearch(request):

q=request.GET.get('q')

error_msg=''

ifnotq:

error_msg='请输入关键词'

returnrender(request,'blog/errors.html',{'error_msg':error_msg})

post_list=Post.objects.filter(title__icontains=q)

returnrender(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是查询表达式(Fieldlookups),其用法是在模型需要筛选的属性后面跟上两个下划线。django内置了很多查询表达式,建议过一遍django官方留个印象,了解每个表达式的作用,以后碰到相关的需求就可以快速定位到文档查询其用途:Fieldlookups

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

results.html

{%iferror_msg%}p{{error_msg}}/p{%endif%}

{%forpostinpost_list%}div

在这里显示文章的相应信息/div{%empty%}divclass="no-post"

没有搜索到符合条件的文章/div{%endfor%}

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

blog/urls.pyurlpatterns=[

#其他url配置

url(r'^search/$',views.search,name='search'),]

大功告成!

django视图中怎么把从前端获取的user作为全局变量

有时候,我们需要Templates模板页面可以使用一些变量。这些变量我们在views.py响应时没有返回设置的变量。例如,如下代码:

#coding:utf-8

from?django.shortcuts?import?render

def?index(request):

context?=?{}

context['title']?=?'测试标题'

return?render(request,?'index.html',?context)

上面是某个views.py的方法之一。它将渲染index.html模版(Template)页面,并返回context字典。该字典是传入变量信息给前端页面。对应的index.html如下:

?

html

head/head

body

h3{{title}}/h3

p是否登录:{{request.user.is_authenticated}}/p

/body

/html

响应结果除了有title变量值之外,还有是否登录信息。该登录信息来自request变量,问题是上面views.py中返回结果的context中没有写入request变量。而模版也没却有可以获取该变量。

这个当时不是无中生有,我一步一步剖析给大家看。原理讲明白之后,就自然懂得如何设置模版(Templates)的全局变量或者叫默认变量。

render方法是render_to_response方法的简写方式。上面的views.py代码相当于如下:

?

#coding:utf-8

from?django.shortcuts?import?render_to_response

from?django.template?import?RequestContext

def?index(request):

context?=?{}

context['title']?=?'测试标题'

return?render_to_response('index.html',?context,?RequestContext(request))

如果去掉render_to_response的第三个参数,即RequestContext(request)部分。

渲染index.html模版页面就无法得到{{request.user.is_authenticated}}的值,即没有传递request变量给前端页面。很明显RequestContext很关键。

有关RequestContext的内容可以从Django官方文档查得。

该类实例化时会解析settings中的Templates设置中的context_processors配置。新建Django项目settings.py文件中默认的Templates设置如下:

?

TEMPLATES?=?[

{

'BACKEND':?'django.template.backends.django.DjangoTemplates',

'DIRS':?[],

'APP_DIRS':?True,

'OPTIONS':?{

'context_processors':?[

'django.template.context_processors.debug',

'django.template.context_processors.request',

'django.contrib.auth.context_processors.auth',

'django.contrib.messages.context_processors.messages',

],

},

},

]

大家可发现context_processors有一系列设置,其中根据django.template.context_processors.request的路径找到Django的相关源码。

Django安装在Python的安装目录下Lib/site-packages/目录中,找到django/template/context_processors.py文件,打开可看到request方法:

?

def?request(request):

return?{'request':?request}

该方法返回一个字典,key为request,value为request对象。很明显,render中的request对象就是通过加载settings中的context_processors列表方法得到字典项。

我们也可以采用这种方法,给Django项目设置全局的模版变量。例如,我的Django名称为myproject,在myproject/myproject目录中创建一个contexts.py文件,代码如下:

?

#coding:utf-8

from?django.conf?import?settings

#?得到语言设置

def?lang(request):

return?{'lang':?settings.LANGUAGE_CODE}

该文件的方法需要request参数,最后需要返回一个字典即可。

再打开settings.py文件,在Templates中添加刚才写的方法引用:

?

TEMPLATES?=?[

{

'BACKEND':?'django.template.backends.django.DjangoTemplates',

'DIRS':?[],

'APP_DIRS':?True,

'OPTIONS':?{

'context_processors':?[

'django.template.context_processors.debug',

'django.template.context_processors.request',

'django.contrib.auth.context_processors.auth',

'django.contrib.messages.context_processors.messages',

#?自定义模版全局变量(默认变量)

'myproject.contexts.lang',

],

},

},

]

添加模版全局变量之后,我们可以在任意位置渲染模版页面无需再手动写相关代码即可使用该变量。

Django开发的网站如何被百度更好收录

1.在做网站之前一定要选好一个服务器,一个服务器的稳定,能帮助你的网站能够快速的收录,如果别人访问你的网站根本就进不去,那就别想被收录了。

2.文章一定要是原创度比较高的文章,一篇文章它的伪原创度一定要大于百分之七十。

3.一定要做好三大标签的撰写,其中标题描述和关键词一定要符合用户体验,并且与企业的品牌,企业的产品都要符合,这样才能使你的网站优化的更好。

4.注册百度站长平台,然后通过链接提交把每天发布的文章提交到百度站长平台上面,就可以使百度蜘蛛有机会抓取那个网页,这样就能够快速的收录网站内容。

结语:以上就是首席CTO笔记为大家整理的关于django如何做全局搜索的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
青松代表什么意思 ...正反面和本人照片能干什么? 注:本人照片不是手持身份证照片... 2024年建议买的5款指尖陀螺(建议收藏) 举起手来60词英语作文 ...年后的再一次发掘,引起国内外媒体的关注。病句... 油性皮肤选购粉饼时需要注意些什么? 油皮适合用什么粉饼? 十大油皮最好用粉饼 excel怎么删除重复数据Excel教你四招快速删除重复数据 奶酪的制作原理是什么? 网页搜索怎么用啊? 梦见炉灶微温 马帮erp可以走亚马逊线上发货物流吗? 防晒霜想洗掉,是不是可以直接用温水加洗面奶就可以啊!谢谢,我是男生不... 怎么让访问不带www的网址跳转到带www的网址上面呢? 商品特性与营销的关系 商品的特性有哪些 什么是商品特性 ...灶里的火很旺,只见锅里的饭在冒泡泡,热气腾腾,是什么意思呀?_百度... ...的明星帅而不油,有分寸感,个个都比张翰好太多,你认为都有谁... ...很帅,但怎么都红不起来的男明星有谁?_百度知 ... 3D视频转换软件软件基本信息 1U、2U、4U是指什么?高性价比机柜推荐 服务器中1U、2U、4U指什么? 北京通州有西服和衬衣订制吗?男式的 北京雅度西服做的怎么样?(上班穿的) ...复习?希望经历过的哥哥姐姐们给我点建议。化学做5 ...初三化学怎么学啊。。哥哥姐姐叔叔阿姨介绍点方法啊。。 ...希望有老师和哥哥姐姐们能帮我出注意。我可以停止一起玩的时间_百度... ...哪位哥哥姐姐帮忙支个招吧,化学要怎样学,具体点, 梦见自己踩上灶台,梦到老式灶台是什么意思 证明:如ATA=I,则A的特征值的绝对值为1 设a=(1,2,。。。n),则矩阵aTa的特征值为多少?请给思路,不要求答案... 设A是N阶方阵,ATA=En,证明:如果|A|=-1,则-1是A的一个特征值。 京东618买什么划算租房app 京东618租房靠谱吗 京东618隔壁租房靠谱吗 我是爱奇艺会员,但是忘记了手机绑定的账号密码,能找回来吗?怎么找... ...的会员,但是退出账号忘记了密码和账号不知道怎么登陆,'现在我想问... ...但是忘记自己是不是会员了,要怎么查啊,账号密码记不清了也登不上去... ...发送错误报告’和’不发送’的一个窗口,点它后,接着被关闭,什么原... ...话诓,不管我点击发送错误报告还是不发送,都会退回桌面.怎么办... ...出现一个小的对话框,说出现错误,发不发送错误报告,选择了发送,则所 ... ...就会出现一个对话框,上面有发送错误报告和不发送错误报告不管我点那... ...从严重错误恢复",点击发送错误报告或不发送,都会自动重启...ORZ... 我的爱奇艺会员借很多人登过,现在不知道被哪个王犊子绑定了手机... ...还有一个爱奇艺万能播放器,想卸载它却不知道怎么卸载,求救!!!_百 ... 笔记本电脑上面的爱奇艺万能播放器在播放电影的中途时,就出现下面这个... 声速和光速哪个快 怎么在家做好吃不腻的四喜丸子?