Пользовательская проверка Django на наборах форм - PullRequest
2 голосов
/ 02 ноября 2010

Я ищу несколько советов о том, как выполнить пользовательскую проверку для наборов форм.

Это то, что у меня есть сейчас, и оно возвращает следующую ошибку, с которой я не совсем знаю, как справиться.

Exception Value: 
'MilestoneFormFormSet' object has no attribute 'save'

Forms.py

class BaseMilestoneFormSet(BaseFormSet):

    def clean(self):
        for form in self.forms:
            data = form.cleaned_data
            target_date = data["target_date"]
            project = data["project"]
            if target_date > project.target_date:
                raise forms.ValidationError("Target Date is outside of project target date")
            return data

MilestoneFormSetNew = modelformset_factory(Milestone, formset=BaseMilestoneFormSet, max_num=50, extra=1)

Views.py отрывок

if request.method == 'POST':  # Loop through the submitted formsets check for erros and save the data.
        formsetNew = MilestoneFormSetNew(request.POST, prefix='new')
        if formsetNew.is_valid():
            formsetNew.save()
            return HttpResponseRedirect(reverse('pooflinger.project.views.detail', args=(project.id,)))

1 Ответ

3 голосов
/ 02 ноября 2010

В вашем чистом методе есть ошибка отступа - возвращаемое значение должно быть вне цикла for.

Но не выполняйте этот тип проверки в наборе форм.Проверка набора форм полезна, когда вы проверяете формы в наборе форм.Вы сравниваете значения в каждой форме, поэтому имеет смысл использовать настраиваемую ModelForm для набора форм.

class MilestoneForm(forms.ModelForm):

    def clean(self):
        data = self.cleaned_data
        target_date = data["target_date"]
        project = data["project"]
        if target_date > project.target_date:
            raise forms.ValidationError("Target Date is outside of project target date")
        return data

MilestoneFormSetNew = modelformset_factory(Milestone, form=MilestoneForm, max_num=50, extra=1)
...