【问题标题】:Flask WTForm render selected with Bootstrap使用 Bootstrap 选择的 Flask WTForm 渲染
【发布时间】:2013-11-26 02:30:16
【问题描述】:

这是一个非常简单的问题,但我似乎找不到一个好的答案。

我存储了有关用户选择的现有数据,并希望将该选择呈现为下拉菜单中的选择。

{% 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)

发现问题!

如果您遇到同样的问题 --- 请检查您的编码!我的 unicode 正在抛出正常的字符串。

【问题讨论】:

    标签: twitter-bootstrap flask wtforms flask-wtforms


    【解决方案1】:

    这不是在模板中完成的,您必须在调用render_template() 之前对Form 对象执行此操作。

    例如:

    form.gender.data = 'male'
    

    【讨论】:

    • 嗨米格尔!我是你教程的超级粉丝!无论如何,我添加了更多细节 --- 我确实在视图中设置了它。它只是没有显示在观看部分。我责怪 Bootstrap。
    • 您是否为该字段分配了有效值?它必须是选项之一,也必须是选项“名称”,而不是“值”。
    • 好的,找到了!我的配置文件中有 #coding: utf8 ,因此尽管字符串看起来相同,但表单无法识别:/现在它已修复但很难看(需要将 int 转换为字符串到 unicode ...)我正在使用一些中文所以必须有unicode。
    • 你为什么不到处使用unicode呢?您的表单类、模板和视图函数都应该使用相同的编码。
    【解决方案2】:

    Miguel 是正确的——这是一个完整的工作示例:

    #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>
    

    【讨论】:

    • 谢谢 Doobeh,原来问题出在 unicode 上,我没有将其包含在代码示例中。我相信其他人会发现您的示例很有帮助
    猜你喜欢
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多