2

フォームセットでカスタム検証を行う方法に関するアドバイスを探しています。

これは私が現在持っているものであり、対処方法が完全にはわからない次のエラーが返されます。

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,)))
4

1 に答える 1

3

clean メソッドにインデント エラーがあります。戻り値は 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)
于 2010-11-02T20:53:51.517 に答える