Итак, сейчас вы пытаетесь получить доступ к request.form
в запросе get.Тем не менее, form
всегда будет пустым в запросе get, потому что такова природа запроса get.Таким образом, только когда вы получите доступ к маршруту @app.route('/matchup-history/<string:matchup_type>'
через почтовый запрос, он сможет правильно перенаправить.
Этот работающий miniapp хорошо отображает это:
from flask import Flask, render_template_string, request
app = Flask(__name__)
TEMPLATE_STRING = """
<form action="{{ url_for('index') }}" method="post">
{{request.form['matchup_type']}}<br><br>
<label><input type="radio" name="matchup_type" value="regular" onclick="this.form.submit()" checked>Regular Season</label>
<label><input type="radio" name="matchup_type" value="playoffs" onclick="this.form.submit()">Playoffs</label>
</form>
"""
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'GET':
return render_template_string(TEMPLATE_STRING)
else:
return render_template_string(TEMPLATE_STRING)
ПервыйКогда вы открываете страницу, вы видите только переключатель.Но как только вы нажмете на переключатель, он поместит форму, и поэтому вы увидите выбранное значение в верхней части страницы.Если вы нажмете еще раз, вы снова отправите форму и т.д.Я думаю, что нет необходимости делать запрос POST с этой формой, потому что вы не обновляете какие-либо данные, вы просто запрашиваете.
from flask import Flask, render_template_string, request
app = Flask(__name__)
TEMPLATE_STRING = """
<form action="{{ url_for('history') }}" method="get">
<select name="owner_id">
{% for owner in owners %}
<option {% if owner['id'] == selected_owner_id %} selected {% endif %}value="{{owner['id']}}">{{owner['name']}}</option>
{% endfor %}
</select>
<label><input type="radio" name="matchup_type" value="regular" {%if selected_matchup_type == 'regular'%}checked{%endif%} onclick="this.form.submit()">Regular Season</label>
<label><input type="radio" name="matchup_type" value="playoffs" {%if selected_matchup_type == 'playoffs'%}checked{%endif%} onclick="this.form.submit()" >Playoffs</label>
<br>Queried data goes here
</form>
"""
owners = [{'id': 1, 'name': 'bob'}, {'id': 2, 'name': 'gary'}, {'id': 3, 'name': 'tom'}]
matchup_types = 'regular', 'playoffs'
@app.route('/history', methods=['GET'])
def history():
owner_id = request.args.get('owner_id', None, type=int)
if owner_id not in [owner['id'] for owner in owners]:
owner_id = owners[0]['id']
matchup_type = request.args.get('matchup_type', None)
if matchup_type not in matchup_types:
matchup_type = matchup_types[0]
# now you know the owner_id and the matchup type, and know that both are valid, do some query to get table data
return render_template_string(TEMPLATE_STRING, owners=owners,
selected_owner_id=owner_id,
selected_matchup_type=matchup_type,
matchup_types=matchup_types)
Я думаю, что это то, что вам нужно.Форма никогда не публикуется, всегда ставится как запрос на получение (<form action="{{ url_for('history') }}" method="get">
).Если значения отсутствуют или недействительны, мы по умолчанию возвращаемся к некоему типу owner / matchup_type.Проверенные значения запоминаются и используются для визуализации шаблона.
Это помещает всю логику фляги в @app.route
, а всю логику дзиндзя - в шаблон.
Некоторые общие замечания:
Я думаю, что доступ к request
в jinja не предпочтителен, потому что jinja по-разному обрабатывает ошибки / пропущенные значения, и если они являются результатом логики, связанной с вашим запросомСтановится трудно угадать, что происходит.Так что разберитесь с входящим запросом на стороне Python.
Вместо того, чтобы переносить 2 радиоблока в зависимости от выбранного значения, просто используйте один блок и проверьте в опциях, какой из них вам нужен.<option {% if some_value == some_other_value %} checked {% endif%}>blabla</option>
.
Сделайте намного больше проверки ввода!В вашем первом примере имя вашего шаблона определяется по некоторому введенному пользователем значению (тип соответствия).Но что, если пользователь публикует несуществующее значение?Вы получаете ошибки.
Если единственное различие между двумя шаблонами состоит в том, какой переключатель выбран, вам не нужны два шаблона.Смотрите обновленную версию, как просто справиться с этим в одном шаблоне.