Колба - Используйте тот же вид, чтобы отобразить форму поиска, а затем результаты поиска - PullRequest
0 голосов
/ 20 октября 2018

Я хочу иметь форму поиска для запроса к базе данных и отображения результатов поиска под ней.Я не хочу, чтобы при обновлении страницы появлялось предупреждение.Также я хочу знать, можно ли это сделать с помощью одной функции просмотра, поскольку во всех уроках, которые я видел, используется более одного.Как этот и этот .

Это работает, но показывает предупреждение, которое запрашивает подтверждение при нажатии кнопки обновления в браузере:

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()])

templates / 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 %}

Это то, что я хотел бы, но это даетpage not redirecting properly error:

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

1 Ответ

0 голосов
/ 20 октября 2018

У вас может быть одна функция для отображения страницы поиска, а затем после form.validate_on_submit() запрашивать базу данных и возвращать результаты.Для результатов поиска добавьте if формулировку , чтобы отобразить их в том же шаблоне, что и форма поиска.

@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 %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...