Как заполнить тег 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 для получения дополнительной информации.