#django #django-forms #formset #inline-formset
#django #django-forms #formset #встроенный-formset
Вопрос:
Я хочу использовать набор форм Django, но с чистым серверным рендерингом и без необходимости Javascript для добавления к нему дополнительных форм. Пользователь должен просто нажать кнопку на странице, и страница должна перезагрузиться с дополнительной формой в наборе форм. Весь пользовательский ввод должен быть сохранен! Соответствующая часть в представлении:
if request.POST.get('add_form') == "true":
cp = request.POST.copy()
cp['form-TOTAL_FORMS'] = int(cp['form-TOTAL_FORMS']) 1
fs = MyFormSet(cp)
Проблема в том, что при MyFormSet(cp)
визуализации представления формы к нему добавляются ошибки проверки (например, «Это поле обязательно»). Это некрасиво и неприемлемо. Как я могу отобразить его без ошибок (они должны присутствовать только при отправке всей формы)?
MyFormSet(initial=...)
похоже, это не вариант, поскольку он также должен работать в a UpdateView
(в документах довольно ясно, что initial
это только для дополнительных форм), а также данные POST нельзя напрямую использовать в качестве начальных значений.
Я очень благодарен за любой намек, поскольку мне потребовалось несколько часов, чтобы никуда не попасть (и, похоже, это такая распространенная функция, поскольку остальная часть Django не зависит от Javascript).
Ответ №1:
Похоже на взлом, но это работает (после инициализации набора форм):
fs._errors = {}
for form in fs:
form._errors = {}
Это удаляет все ошибки из полей при отображении в HTML. Фоном является то, что когда _errors
установлено значение None
(по умолчанию), форма проверяет себя при ее отображении. Когда для него установлено значение пустой dict, форма больше не будет проверять себя и просто «думает», что в ней нет ошибок. Таким образом, сообщения об ошибках не отображаются.