Django的表单动作属性无法正常工作

时间:2018-12-12 19:53:40

标签: python django forms elasticsearch search

我正在使用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 %}

1 个答案:

答案 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>