Работа с 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 для добавления строк, чтобы рендеринг строки был согласован между строками, созданными на стороне сервера, и строками, созданными на стороне клиента.