Рендеринг Flask WTForm, выбранный с помощью Bootstrap

Это действительно простой вопрос, но я не могу найти хороший ответ.

У меня есть существующие данные о выборе пользователя, и я хочу отобразить этот выбор как выбранный в раскрывающемся списке.

{% macro render_bootstrap_field(field) %}

<div class="form-group {% if field.errors %} error {% endif %}">
    <label class="col-lg-2 control-label">{{ field.label }}</label>

    <div class="col-lg-8">
        {{ field(class='form-control')|safe }}
        {% if field.errors %}
            {% for error in field.errors %}
                <span class="help-inline">[{{ error }}]</span><br>
            {% endfor %}
        {% endif %}
    </div>
</div>
{% endmacro %}}

И вот как это визуализируется:

{{ render_bootstrap_field(form.gender) }}

Он не показывает, что выбрано, и я не могу придумать способ, кроме использования jquery, чтобы добавить класс вручную, но это было бы больно.

Большое спасибо за помощь!

Изменить: забыл включить мою функцию view.py! Так я и поставил

@app.route('/edit_user', methods=['GET', 'POST'])
@login_required
def edit_user():
  form = UserInfoForm(g.user.nickname)
  form.gender.choices = app.config['GENDER']
  form.year.choices = app.config['BIRTH_YEAR']
  form.education.choices = app.config['EDUCATION']

  if request.method == 'POST' and form.validate_on_submit():
     flash("submitting")
     g.user.nickname = form.nickname.data
     g.user.gender = form.gender.data
     g.user.education = form.education.data
     g.user.year = form.year.data
     g.user.info_complete = True
     db.session.add(g.user)
     db.session.commit()
     return redirect(url_for('edit_user'))

  elif request.method != "POST":
     form.nickname.data = g.user.nickname
     form.gender.data = g.user.gender
     form.education.data = g.user.education
     form.year.data = g.user.year


  return render_template('edit_user.html',
                         form=form,
                         user=g.user)

Проблема найдена!

Если вы столкнулись с той же проблемой --- проверьте кодировку! Мой юникод отбрасывал обычную строку.


person yifanwu    schedule 26.11.2013    source источник


Ответы (2)


Это не делается в шаблоне, вы должны сделать это на объекте Form перед вызовом render_template().

Например:

form.gender.data = 'male'
person Miguel    schedule 26.11.2013
comment
Привет Мигель! Я большой поклонник вашего урока! В любом случае, я добавил еще несколько деталей --- я установил его в представлении. Это просто не отображается в части просмотра. Я виню Bootstrap. - person yifanwu; 26.11.2013
comment
Вы присваиваете допустимое значение полю? Это должен быть один из вариантов, а также имя выбора, а не значение. - person Miguel; 26.11.2013
comment
ОК нашел! У меня было # coding: utf8 в моем файле конфигурации, поэтому форма не распознавалась, несмотря на то, что строки кажутся одинаковыми: / Теперь это исправлено, но это уродливо (нужно преобразовать int в строку в unicode...) Я использую некоторые Китайцы поэтому должны иметь юникод. - person yifanwu; 27.11.2013
comment
Почему бы вам не использовать юникод везде? Ваш класс формы, шаблоны и функции просмотра должны использовать одну и ту же кодировку. - person Miguel; 27.11.2013

Мигель прав - вот полный рабочий пример:

#app.py
from flask import Flask, render_template
from flask_wtf import Form
from wtforms import SelectField

app = Flask(__name__)
app.secret_key = 'Testing BS'

choices = [
    ('1', 'Alice'),
    ('2', 'Bob'),
    ('3', 'Carol'),
]

class MyForm(Form):
    name = SelectField('Pick Name', choices=choices)

@app.route('/', methods=['post','get'])
def hello_world():
    form = MyForm()
    form.name.data = '2' # lets set Bob to be active.
    return render_template('example.html', form=form)


if __name__ == '__main__':
    app.run(debug=True)

И шаблон:

#example.html
{% macro render_bootstrap_field(field) %}

<div class="form-group {% if field.errors %} error {% endif %}">
    <label class="col-lg-2 control-label">{{ field.label }}</label>

    <div class="col-lg-8">
        {{ field(class='form-control')|safe }}
        {% if field.errors %}
            {% for error in field.errors %}
                <span class="help-inline">[{{ error }}]</span><br>
            {% endfor %}
        {% endif %}
    </div>
</div>
{% endmacro %}

<form method="POST" action="#">
    {{ render_bootstrap_field(form.name) }}
    <input type="submit" value="Go">
</form>
person Doobeh    schedule 26.11.2013
comment
Спасибо, Doobeh, оказалось, что проблема была с юникодом, который я не включил в пример кода. Я уверен, что другие найдут ваш образец полезным - person yifanwu; 27.11.2013