Flask - форматирует URL сайта для отображения поискового запроса - PullRequest
0 голосов
/ 21 октября 2018

Я хочу отобразить поиск из формы в URL, как https://website.com/search?q=query.Как я могу сделать это в колбе?

forms.py

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

class SearchForm(FlaskForm):
    search = StringField('search', validators=[DataRequired()])

main.py

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

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 table %}
    <h1>Search results for "{{ query }}":</h1>
    {{ table }}
  {% endif %}
</div>
{% endblock page_content %}

1 Ответ

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

В вашем примере https://website.com/search?q=query пространство имен url равно search, а q является аргументом запроса GET.Чтобы сделать это во Flask, вам нужно направить ваше представление на /search и извлечь q из аргументов запроса GET.WTForms позволяет вашей форме использовать метод GET или POST, в зависимости от вашего экземпляра.Это описано в документации Flask здесь .

Наконец, ваш код может выглядеть примерно так:

forms.py

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

class SearchForm(FlaskForm):
    q = StringField('q', validators=[DataRequired()])

main.py

@app.route('/', methods=['GET'])
@app.route('/search', methods=['GET'])
def index():
    form = SearchForm(request.args)
    query = request.args.get('q', None)
    table = None
    if query is not None:
        items = Foo.query.filter(Foo.name.like('%'+query+'%')).all()
        table = ItemTable(items)
    return render_template('index.html', form=form, query=query, table=table)

templates / index.html:

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

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

Я также немного реорганизовал ваш код, потому что двойной вызов метода render_template для почти схожей логики кажется довольно избыточным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...