Добавление дополнительной формы в набор форм с использованием POST без Javascript и проверки

#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, форма больше не будет проверять себя и просто «думает», что в ней нет ошибок. Таким образом, сообщения об ошибках не отображаются.