Эти formsets показывают точно противоположное поведение, которое я хочу.
Мое представление настраивается как это:
def post(request): # TODO: handle vehicle formset
VehicleFormSetFactory = formset_factory(VehicleForm, extra=1)
if request.POST:
vehicles_formset = VehicleFormSetFactory(request.POST)
else:
vehicles_formset = VehicleFormSetFactory()
И мой шаблон похож на это:
<div id="vehicle_forms">
{{ vehicles_formset.management_form }}
{% for form in vehicles_formset.forms %}
<h4>Vehicle {{forloop.counter}}</h4>
<table>
{% include "form.html" %}
</table>
{% endfor %}
</div>
Тем путем это первоначально генерирует только 1 форму, как я хочу. Но я хочу, чтобы та одна форма требовалась!
Когда я динамично добавляю незаполненные бланки с JavaScript и vehicles_formset.empty_form
все те дополнительные формы требуются, который я не хочу.
Из документов:
formset достаточно умен для игнорирования дополнительных форм, которые не были изменены.
Это - поведение, которое показывает первая форма (не, что я хочу), но не поведение, что дополнительные формы показывают (что я действительно хочу).
Есть ли некоторый атрибут, я могу, может измениться, чтобы, по крайней мере, сделать одну форму требуемой?
О, я думаю, понимаю. Попробуйте следующее:
from django.forms.formsets import BaseFormSet, formset_factory
class OneExtraRequiredFormSet(BaseFormSet):
def initial_form_count(self):
return max(super(OneExtraRequiredFormSet,self).initial_form_count() - 1,0)
VehicleFormSetFactory = formset_factory(VehicleForm, formset=OneExtraRequiredFormSet, extra=1)
== Исходный ответ ниже ==
Когда вы говорите «сделать хотя бы одну требуемую форму», я предполагаю, что вы имеете в виду «сделать только одну дополнительную форму необходимой, независимо от того, сколько их было добавлено с помощью javascript» .
Вам нужно будет иметь скрытый ввод на вашей странице, который содержит количество форм, добавленных с помощью javascript, а затем использовать это число, минус 1, в качестве значения для передачи как extra
атрибут вашего конструктора наборов форм.
Хорошо. .. это делает первую форму обязательной.
class RequiredFormSet(BaseFormSet):
def clean(self):
if any(self.errors):
return
if not self.forms[0].has_changed():
raise forms.ValidationError('Please add at least one vehicle.')
Единственная «проблема» в том, что если есть 0 форм, то метод clean
, похоже, вообще не вызывается, поэтому я не знаю, как проверить, есть ли 0. На самом деле ... этого никогда не должно происходить (за исключением того, что в моем JS есть ошибка, позволяющая удалить все формы).