Работа с WTForms FieldList

Я использую WTForms с Flask через расширение Flask.WTF. Однако этот вопрос не зависит от фляк.

WTForms включает поле FieldList для списков полей. Я хотел бы использовать это, чтобы создать форму, в которой пользователи могут добавлять или удалять элементы. Для создания динамических добавлений виджетов потребуется какая-то структура Ajax, но документация WTForms не упоминает об этом.

Другие структуры, такие как Deform поставляется с поддержкой Ajax. Есть ли аналогичные рамки для WTForms?

Ответ 1

Я использовал что-то вроде этого с моим FieldList/FormField, чтобы добавить дополнительные записи:

$(document).ready(function () {
    $('#add_another_button').click(function () {
        clone_field_list('fieldset:last');
    });
});

function clone_field_list(selector) {
    var new_element = $(selector).clone(true);
    var elem_id = new_element.find(':input')[0].id;
    var elem_num = parseInt(elem_id.replace(/.*-(\d{1,4})-.*/m, '$1')) + 1;
    new_element.find(':input').each(function() {
        var id = $(this).attr('id').replace('-' + (elem_num - 1) + '-', '-' + elem_num + '-');
        $(this).attr({'name': id, 'id': id}).val('').removeAttr('checked');
    });
    new_element.find('label').each(function() {
        var new_for = $(this).attr('for').replace('-' + (elem_num - 1) + '-', '-' + elem_num + '-');
        $(this).attr('for', new_for);
    });
    $(selector).after(new_element);
}

Удалить кнопки будет намного сложнее.

(Код в основном заимствован из ответа на Динамическое добавление формы в набор форм Django с помощью Ajax.)

Ответ 2

Из вашего описания я не вижу, почему Ajax особенно необходим, хотя, конечно, вам нужна логика JavaScript для добавления/удаления строк. Я реализовал эту функциональность с помощью WTForms, но без специальной поддержки от WTForms; вам просто нужно убедиться, что при создании виджетов на стороне клиента вы делаете это с использованием имен полей, которые WTForms правильно анализируют в списке на стороне сервера. Вы можете клонировать существующую строку с использованием клиентского JavaScript для добавления строк, чтобы рендеринг строки был согласован между строками, созданными на стороне сервера, и строками, созданными на стороне клиента.