Динамические формы WTF на основе файла конфигурации - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь создать определение формы на основе файла конфигурации.Код только для целей тестирования:

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 %}

, которая, к сожалению, не работает :( Цикл работает, но он не может отобразитьitemsl. Есть идеи?

1 Ответ

0 голосов
/ 13 июня 2018

Я думаю, что это ваш класс строительства.Я считаю, что формы 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 не разрешают динамическое построение явно.

...