例如,我有一个标题How to use User Model in Django
,而我仅使用关键字django
搜索,然后它返回所有带有django的标题,这很好,但是当我输入类似django user model
的关键字时,它不返回任何值。我该怎么解决
任何帮助将不胜感激
views.py
def search_blogs(request):
q = request.GET.get('q')
if q:
blogs = Blog.objects.filter(title__icontains=q).order_by('-created')
return render(request,'blog/search_blogs.html',{"blogs":blogs,'q':q})
else:
messages.error(request,'Please enter some keyword to search')
return redirect('blog:blogs')
模板
<form action="{% url 'blog:search_blog' %}" class="search-form">
<input type="text" name="q" placeholder="Search blogs" align="center" >
<input type="submit" value="Search" class="btn-sm btn-info >
</form>
更新:
q = request.GET.get('q')
if q:
words = request.GET.get('q').split(" ")
q_filters = Q()
for word in words:
q_filters |= Q(title__icontains=word)
blogs = Blog.objects.filter(q_filters)
return render(request, 'blog/search_blogs.html', {"blogs": blogs, 'q': words})
else:
messages.error(request,'Please enter some keyword to search')
return redirect('blog:blogs')
现在更新的代码空间中也是过滤器的输入。例如,如果我搜索了user model in django
,它还会返回另一个结果,该结果也有空间,但没有其他仅与 space 相匹配的标题>
答案 0 :(得分:2)
一种方法是使用Q
并将多个__contains
组合在一起:
blogs = Blog.objects.filter(Q(title__icontains="word one") | Q(title__icontains="word two"))
您可以使用for循环来生成足够的过滤器:
words = request.GET.get('q', '').split(" ")
q_filters = Q()
for word in words:
q_filters |= Q(title__icontains=word)
blogs = Blog.objects.filter(q_filters)
但是,如果您使用PostgreSQL作为数据库,则可以在这里看看:
答案 1 :(得分:0)
如果您使用Postgres,则Django为您提供全文搜索支持。参见https://docs.djangoproject.com/en/3.0/topics/db/search/
有关搜索的高级概述,请参见https://docs.djangoproject.com/en/3.0/topics/db/search/。
如果您需要更强大的全文搜索,则可以使用Elasticsearch。有很多方法可以集成Django。例如django-haystack应用或Elasticsearch DSL library