У меня есть страница, на которой отображается несколько наборов форм, каждый из которых имеет префикс. Наборы форм создаются с использованием formset_factory
параметров по умолчанию, включая extra = 1
. Строки можно добавлять или удалять с помощью JavaScript.
Если пользователь добавляет новые данные, отображается одна пустая строка. Идеально.
Если пользователь добавил данные, но проверка формы завершилась неудачно, и в этом случае набор форм заполняется данными POST с использованием MyFormset (data, prefix = 'o1-formsetname')
и т. Д., Только те данные, которые они вошли, появляются. Опять же идеально. ( o1
и т. д. генерируются динамически, каждый o
соответствует «опции», и каждая «опция» может иметь несколько наборов форм).
Однако, если пользователь редактирует существующие данные, в этом случае представление заполняет набор форм, используя MyFormset (initial = somedata, prefix = 'o1-formsetname')
, где somedata
- список dicts данных, которые поступили из модели в базе данных, после этих данных вставляется дополнительная пустая строка. Я не хочу, чтобы появлялась пустая строка, если пользователь явно не добавит ее с помощью JavaScript.
Есть ли простой способ предотвратить отображение в наборе форм лишней строки, если установлены начальные данные? Причина, по которой я использую initial
в третьем примере, заключается в том, что если бы я просто передал данные с помощью MyFormset (somedata, prefix = 'o1-formsetname')
, мне пришлось бы выполнить дополнительный шаг по переформатированию всех данных в стиле POSTdata, включая префиксы для каждого поля, например o1-formsetname-1-price: x
и т. д., а также вычислить данные формы управления, которые добавляет целый груз усложнения.
Одним из решений может быть перехват набора форм перед его отправкой в шаблон и ручное удаление строки, но атрибут extra_forms
, похоже, не доступен для записи, а для extra
установлено значение 0
не имеет значения. Я также мог бы заставить JavaScript обнаружить этот случай и удалить строку. Однако я не могу не думать, что упускаю что-то очевидное, поскольку поведение, которое я хочу, - это то, что мне кажется разумным ожидаемым поведением.
Спасибо.