我尝试根据配置文件生成表单定义。该代码仅用于测试目的:
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 %}
遗憾的是不起作用:(循环有效,但它无法呈现物品。任何想法?
答案 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不允许明确地进行动态构建。