发布网友 发布时间: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如何做全局搜索的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~