Django formsets: сделать сначала требуемыми?

Эти 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 достаточно умен для игнорирования дополнительных форм, которые не были изменены.

Это - поведение, которое показывает первая форма (не, что я хочу), но не поведение, что дополнительные формы показывают (что я действительно хочу).

Есть ли некоторый атрибут, я могу, может измениться, чтобы, по крайней мере, сделать одну форму требуемой?

35
задан Serjik 19 December 2015 в 08:39
поделиться

2 ответа

О, я думаю, понимаю. Попробуйте следующее:

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 атрибут вашего конструктора наборов форм.

2
ответ дан 27 November 2019 в 06:31
поделиться

Хорошо. .. это делает первую форму обязательной.

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 есть ошибка, позволяющая удалить все формы).

10
ответ дан 27 November 2019 в 06:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: