Связывание ошибок с нужным полем в списках полей WTForms

Я использую WTForm для проверки формы, которую я отправляю непосредственно из модели javascript (заполняется посредством нокаута). В моей форме есть список банковских счетов, которые можно динамически добавлять / удалять. На стороне Python у меня есть что-то вроде этого:

class Account(Form):
    acc_name        = TextField('Account', [validators.Length(min=2, max=35)])    

class InformationForm(Form):
    account_list = FieldList(FormField(Account))

Данные json, полученные для проверки, следующие:

'account_list': [{'acc_name': 'aaaaa'}, {'acc_name': 'b'}]}

Проблема тогда, когда я проверяю, я получаю что-то вроде этого, где нет никакого способа узнать, какая учетная запись в списке является источником ошибки:

'account_list': [{'acc_name': [u'Field must be between 2 and 35 characters long.']}

Как я могу сделать, чтобы связать ошибку с нужной учетной записью?

РЕДАКТИРОВАТЬ: в конце концов я сделал это, добавив метод getErrors в свой класс InformationForm, который создает словарь, индексируемый уникальным идентификатором для каждой учетной записи, где значения являются ошибками каждой учетной записи. Затем я возвращаю это как json в свое приложение. Я держу вопрос открытым, если есть "естественное" решение...

1 ответ

Каждый отдельный элемент в FieldList сам по себе является полем. Если FieldList содержит TextField, то каждая запись является TextField. Если он содержит FormField, то это FormField (который затем содержит форму со своими собственными полями). Доступ к записям FieldList можно получить либо путем итерации FieldList, либо путем доступа к .entries атрибут FieldList.

Так что вместо того, чтобы смотреть на form.account_list.errors посмотрите на ошибки в закрытом поле.

Итак, для вашего использования, что-то вроде этого:

{% for subfield in form.account_list %}
    <!-- subfield in this case is an instance of FormField -->
    {{ subfield.form.acc_name() %}
    {% if subfield.errors %}
        {% for error in subfield.form.acc_name.errors %}
            <p class="error">{{ error }}</p>
        {% endfor %}
    {% endif %}
{% endfor %}

Вы, вероятно, захотите абстрагировать это в макрос вместо того, чтобы делать это для каждой настройки поля специальности, если это то, что вам нужно делать последовательно и часто.

Другие вопросы по тегам