python - Flask - 使用相同的 View 呈现搜索表单然后搜索结果

标签 python search flask

我想要一个搜索表单来查询数据库并在其下方显示搜索结果。我不希望在刷新页面时出现任何确认警告。我还想知道这是否可以通过单个 View 函数来完成,因为我见过的所有教程都使用了多个 View 函数。喜欢this onethis one .

这是有效的,但它会显示一条警告,要求在单击浏览器上的刷新按钮时进行确认:

主要.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)

表单.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('/', methods=['GET', 'POST'])
def index():
    form = SearchForm(request.form)
    if form.validate:
        session['query'] = form.data['search']
        return redirect(url_for('index'))

    if 'query' in session:
        results = Foo.query.filter(Foo.name.like('%'+session.get('query')+'%')).all()
        return render_template('index.html', form=form, query=session.get('query'), results=results)
    else:
        return render_template('index.html', form=form)

最佳答案

您可以使用一个函数来呈现搜索页面,然后在 form.validate_on_submit() 之后查询数据库并返回结果。对于搜索结果添加 if statetment将它们显示在与搜索表单相同的模板上。

@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)

搜索.html

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

关于python - Flask - 使用相同的 View 呈现搜索表单然后搜索结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52904116/

相关文章:

python - 当 xpath = 没有这样的元素时停止循环

python - 改进文本区域检测(OpenCV、Python)

python - 如何在 django 中使用 get_next_by_FOO() ?

mysql - 在 MySQL 的 varchar 字段中搜索整数值

flask - 使用 Flask Mail 和 SendGrid 导入 CSS 文件不起作用

python - celery worker 在任务完成后不释放内存

performance - 是什么让 Everything 的文件搜索和索引如此高效?

android - Algolia 和 firestore 价格 + 评论

python flask上传文件但不保存使用

python - 带有可插入 View 的 flask 扩展中的 url_for Builderror