Джанго и пустой набор форм действительны - PullRequest
9 голосов
/ 19 декабря 2010

У меня небольшая проблема с набором форм.

Я должен отобразить несколько наборов форм на странице, и каждый набор форм имеет несколько форм.Итак, я сделал что-то вроде этого:

#GET
for prod in products:
     ProductFormSet = modelformset_factory(Product,exclude=('date',),extra=prod.amount)
     formsset.append(ProductFormSet(prefix="prod_%d"%prod.pk))

#POST
for prod in products:
     ProductFormSet = modelformset_factory(Product,exclude=('date',),extra=prod.amount)
     formsset.append(ProductFormSet(request.POST,prefix="prod_%d"%prod.pk))

Проблема в том, что когда я отправляю страницу, пустые формы «автоматически» действуют (без проверки), но если я заполняю одно поле в одной форме, проверкаработает над этим.

Я не знаю почему, поэтому, если у кого-то есть идея,

спасибо.

Ответы [ 4 ]

21 голосов
/ 22 марта 2011

Я столкнулся с этим вопросом, исследуя другую проблему. Копаясь в источнике Django в поисках решения моей проблемы, я нашел ответ на этот вопрос, поэтому я запишу его здесь:

Когда форме разрешено иметь пустые значения (это относится к пустым формам, содержащимся в наборе форм) и отправленные значения не изменились по сравнению с исходными, проверка пропускается. Проверьте метод full_clean () в django / forms / forms.py (строка 265 в Django 1.2):

# If the form is permitted to be empty, and none of the form data has
# changed from the initial data, short circuit any validation.
if self.empty_permitted and not self.has_changed():
     return

Я не уверен, какое решение вы ищете (также этот вопрос уже несколько устарел), но, возможно, это поможет кому-то в будущем.

10 голосов
/ 21 января 2013

@ Джонас, спасибо.Я использовал ваше описание, чтобы решить мою проблему.Мне нужна форма, чтобы НЕ проверять, когда пусто.(Формы добавлены с помощью javascript)

class FacilityForm(forms.ModelForm):
    class Meta:
        model = Facility

    def __init__(self, *arg, **kwarg):
        super(FacilityForm, self).__init__(*arg, **kwarg)
        self.empty_permitted = False


 facility_formset = modelformset_factory(Facility, form=FacilityForm)(request.POST)

При отправке будут отображаться все пустые формы.

2 голосов
/ 06 апреля 2012

Для форм, созданных на основе «дополнительного» параметра «formset_factory», свойству «empty_permitted» присвоено значение True.(см .: formset.py строка 123)

# Allow extra forms to be empty.
    if i >= self.initial_form_count():
        defaults['empty_permitted'] = True

Так что, кажется, лучший способ использовать «начальный» параметр FormSet, а не «дополнительный» параметр «formset_factory» для этого варианта использования.

Описание можно найти по адресу , используя набор исходных данных с формой

0 голосов
/ 12 апреля 2018

Просто лучше.Поскольку Formset представляет собой список форм, вы можете повторить этот набор.

if FormSet(request.POST,).is_valid():
    for form in FormSet:
        # Check if value is empty using value().
        if form['field'].value():
            # this form's field is not empty. Create and save object.
            object = form.save()
...