Я думаю, что это ваш класс строительства.Я считаю, что формы wtf требуют строгого формата;Атрибут класса представляет собой 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__
, и, возможно, в пределах определения __init__(self)
, но я не пробовал их и предпочел приведенную выше форму построения]
Затем вам нужно изменить jinja2 так, чтобы он перебирал атрибуты 'product_0', 'product_1' и т. Д., Например:
{% 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 %}
Вы также можете использовать это как динамический конструктор, так чтоесли число ваших продуктов изменилось, замените 4 на N и поместите N в качестве аргумента функции.FlaskForms не разрешают динамическое построение явно.