基于配置文件的动态WTF表单

时间:2018-06-12 21:22:01

标签: flask flask-wtforms

我尝试根据配置文件生成表单定义。该代码仅用于测试目的:

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
class B2BForm(FlaskForm):
  products = list()
  for i in range(0,4):
      products.append(StringField('Name asd '+str(i), validators=[DataRequired()]))

然后我渲染我的表格:

{% for p in form.products %}
  <div class="form-group">
      <label for="password">Label: {{p.label}}</label>
      {% for error in p.errors %}
          <div style="color: red;">[{{ error }}]</div>
      {% endfor %}
    </div>
 {% endfor %}

遗憾的是不起作用:(循环有效,但它无法呈现物品。任何想法?

1 个答案:

答案 0 :(得分:0)

我认为你的班级建设。我相信wtf表格需要严格的格式; class属性是wtf_Field而不是字段列表。尝试改为

def index():
    def B2BForm():
        class _B2BForm(FlaskForm):
            prod_list = list()
            pass
        for i in range(4):
            setattr(_B2BForm, 'product_' + str(i), StringField('Name asd ' + str(i), validators=[DataRequired()]))
            _B2BForm.prod_list.append(str(i))
        return _B2BForm()
    return render_template('index.html', form=B2BForm())

[注意你也可以使用元类和__metaclass__进行这种类型的构造,并且可能在def __init__(self)内,但我还没有尝试过这些并且更喜欢上面的构造形式] < / p>

然后,您需要更改您的jinja2以循环您的属性&quot; product_0&#39;,&#39; product_1&#39;等,像这样:

{% for p_int in form.prod_list %}
        <div class="form-group">
            <label for="password">Label: {{ form['product_'+p_int].label }}</label>
            {% for error in form['product_'+p_int].errors %}
                <div style="color: red;">[{{ error }}]</div>
            {% endfor %}
        </div>
{% endfor %}

您也可以将其用作动态构造函数,因此如果您的产品数量更改为N替换4,并将N作为参数添加到函数中。 FlaskForms不允许明确地进行动态构建。