Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Flask-使用相同的视图呈现搜索表单,然后呈现搜索结果_Python_Search_Flask - Fatal编程技术网

Python Flask-使用相同的视图呈现搜索表单,然后呈现搜索结果

Python Flask-使用相同的视图呈现搜索表单,然后呈现搜索结果,python,search,flask,Python,Search,Flask,我想要一个搜索表单来查询数据库并在下面显示搜索结果。我不希望刷新页面时出现任何确认警告。另外,我想知道是否可以用一个视图函数来完成,因为我看到的所有教程都使用了多个视图函数。喜欢和 这正在工作,但在单击浏览器上的“刷新”按钮时会显示一条警告,要求确认: main.py @app.route('/', methods=['GET', 'POST']) @app.route('/index', methods=['GET', 'POST']) def index(): form = Sear

我想要一个搜索表单来查询数据库并在下面显示搜索结果。我不希望刷新页面时出现任何确认警告。另外,我想知道是否可以用一个视图函数来完成,因为我看到的所有教程都使用了多个视图函数。喜欢和

这正在工作,但在单击浏览器上的“刷新”按钮时会显示一条警告,要求确认:

main.py

@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
def index():
    form = SearchForm()
    query = form.data['search']
    if query != '':
        results = Foo.query.filter(Foo.name.like('%'+query+'%')).all()
        return render_template('index.html', form=form, query=query, results=results)
    return render_template('index.html', form=form)
forms.py

from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired

class SearchForm(FlaskForm):
    search = StringField('search', validators=[DataRequired()])
模板/index.html

{% block page_content %}
<div class="page-header">
  <form style="display: inline;" action="{{ url_for('index') }}" method="post" name="search">
    {{ form.search(size=20) }}
    <input type="submit" value="Search">
  </form>

  {% if results %}
    <h1>Search results for "{{ query }}":</h1>
    {{ results }}
  {% endif %}
</div>
{% endblock page_content %}

您可以使用一个函数来呈现搜索页面,然后在
表单之后。在提交()上验证并查询数据库并返回结果。对于搜索结果,请添加以将其显示在与搜索表单相同的模板上

@app.route('/search', methods=['GET', 'POST'])
def search():
    form = SearchForm()
    if form.validate_on_submit():
        search_term = form.query.data
        results = Foo.query.all()
        return render_template('search.html', form=form, results=results)
    return render_template('search.html', form=form)
search.html

{% block content%}
<form method="post">
    {{ form.csrf_token }}
    {{ form.query }}
    {{ form.submit }}
    {% if results %}
        {{ results }}
    {% endif %}
</form>
{% endblock %}
{%block content%}
{{form.csrf_token}
{{form.query}
{{form.submit}
{%if结果%}
{{results}}
{%endif%}
{%endblock%}

它可以工作,但在刷新时会显示确认警告。什么是确认警告?这是因为浏览器在被要求刷新页面时会重复上次发送的请求。当最后发送的请求是带有表单数据的POST请求时,刷新将导致重复的表单提交,这在几乎所有情况下都不是所需的操作。它已通过post/redirect/get模式修复。您必须更改,以便它重定向到不同的视图,即
def show_results():
。这也是您无法共享url的原因,即
example.com/search?query='some text'
。此示例中缺少一些内容。接下来,它将呈现一个没有可见输入字段的空页面,以执行搜索查询。
{% block content%}
<form method="post">
    {{ form.csrf_token }}
    {{ form.query }}
    {{ form.submit }}
    {% if results %}
        {{ results }}
    {% endif %}
</form>
{% endblock %}