Набор форм Django - показывать дополнительные поля только при отсутствии начального набора данных?

У меня есть страница, на которой отображается несколько наборов форм, каждый из которых имеет префикс. Наборы форм создаются с использованием 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 обнаружить этот случай и удалить строку. Однако я не могу не думать, что упускаю что-то очевидное, поскольку поведение, которое я хочу, - это то, что мне кажется разумным ожидаемым поведением.

Спасибо.

11
задан garybryan 9 September 2011 в 14:32
поделиться