Как заполнить тег select с помощью Flask?
Я пытаюсь получить доступ к списку объектов JSON (из mongo) в python для заполнения выпадающего списка с помощью шаблонов колб. Впоследствии, мне нужно получить доступ к выбранному элементу. У меня возникли трудности с заполнением списка. Вот мой код и шаблон python. Кто-нибудь может указать мне правильное направление? Я не смог найти хорошую документацию о том, как заполнить список dd этими шаблонами.
PYTHON:
@app.route('/page', methods=["GET", "POST"])
@login_required
def chooser():
# Option list returns a list of JSON objects
option_list = get_options(g.user)
# {u'_id': ObjectId('52a347343be0b32a070e5f4f'), u'optid': u'52a347343be0b32a070e5f4e'}
# for debugging, checks out ok
print option_list
# Get selected id & return it
if request.form['submit'] == 'Select':
optid = o.optid
resp = 'You chose: ', optid
return Response(resp)
return render_template('chooser.html')
HTML-код Шаблон:
{% extends "layout.html" %}
{% block content %}
<h2>Chooser<h2>
<h3><table><form action="" method="POST">
<td>
<label>Select :</label>
<select name="option" width="300px">
{% for o in option_list %}
<option name="{{ o.optid }}" SELECTED>{{ o.optid }}</option>
</select>
</td>
<td>
<input class="button1" type="submit" value="Select">
</td>
{% endfor %}
</form></table><h3>
</div>
{% endblock content %}
1 ответов
есть несколько вещей неправильно здесь:
во-первых, когда вы называете render_template('chooser.html')
, вы никогда не передаете никаких аргументов в процесс рендеринга шаблона. По умолчанию Jinja2 не ошибается, если атрибут вашей ссылки не найден, поэтому вы не получите сообщение об ошибке. В принципе, для кода в вашем шаблоне, который выглядит так:
{% for o in option_list %}
....
{% endfor %}
внутренности этого цикла for никогда не отображаются, потому что вы никогда не указываете, что option_list
есть. В этом случае Jinja2 будет просто по умолчанию это пустая строка, а затем вы по существу зацикливаетесь на символах пустой строки (что, конечно, означает, что внутренности for-loop никогда не запускаются).
Итак, вам нужно указать шаблон, что значение option_list
- это:
return render_template('chooser.html', option_list=option_list)
другая проблема заключается в том, что ваш HTML будет испорчен из-за того, где вы поставили свой цикл for:
<select name="option" width="300px">
{% for o in option_list %}
<option value="{{ o.optid }}" SELECTED>{{ o.optid }}</option>
</select>
</td>
<td>
<input class="button1" type="submit" value="Select">
</td>
{% endfor %}
Я думаю, вы хотели сделать следующее:
<select name="option" width="300px">
{% for o in option_list %}
<option value="{{ o.optid }}" SELECTED>{{ o.optid }}</option>
{% endfor %}
</select>
</td>
<td>
<input class="button1" type="submit" value="Select">
</td>
посмотреть рендеринг часть учебника или документация Jinja2 для получения дополнительной информации.