我正在使用django 1.11中的搜索功能开发应用程序。我安装了elasticsearch-一切正常。
在base.html和url 127.0.0.1:8000
下-我有要搜索的表单,我想在此保留此表单。另一方面,我有带有视图,URL,模板的搜索应用程序-在URL 127.0.0.1:8000/search/
下-搜索在这里起作用。
要解决此问题,请在主页上搜索并使用我尝试以Django形式使用action
属性的结果在网站上重定向。
base.html中的表单
<form action="{% url 'search:search' %}" method="post">
{% csrf_token %}
<div class="input-group">
<input type="text" class="form-control" id="q" {% if request.GET.q %}value="{{ request.GET.q }}"{% endif %} name="q" placeholder="Search">
<div class="input-group-append">
<button class="btn btn-outline-primary" type="button">GO</button>
</div>
</div>
</form>
在搜索应用中查看
def search(request):
q = request.GET.get('q')
if q:
posts = PostDocument.search().query('match', title=q)
else:
posts = ''
return render(request, 'search/search.html', {'posts': posts})
带有结果的模板
{% extends 'base.html' %}
{% block content %}
{% for p in posts %}
<a href="#">{{ p.title }}</a>
{% endfor %}
{% endblock content %}
{% block sidebar %}{% endblock sidebar %}
答案 0 :(得分:1)
您在这里混合了GET和POST。如果方法是method="post"
,则数据将在请求中传递,并因此在request.POST
查询字典中结束。
另一方面,如果方法是method="get"
,则数据以URL的 querystring 结尾。在这种情况下,您确实可以使用request.GET
。
通常(并非总是),搜索查询是使用查询字符串完成的,因为一个人可以复制URL并将其发送给另一个人,这样该人就可以看到搜索结果。
因此,您可以将表格更改为:
<form action="{% url 'search:search' %}" method="get">
{% csrf_token %}
<div class="input-group">
<input type="text" class="form-control" id="q" {% if request.GET.q %}value="{{ request.GET.q }}"{% endif %} name="q" placeholder="Search">
<div class="input-group-append">
<button class="btn btn-outline-primary" type="button">GO</button>
</div>
</div>
</form>