I am looking for some advice on how to do custom validation on formsets.
This is what I have right now and it returns the following error that I do not entirely know how to deal with.
Exception Value:
'MilestoneFormFormSet' object has no attribute 'save'
Forms.py
class BaseMilestoneFormSet(BaseFormSet):
def clean(self):
fo开发者_开发知识库r 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 excerpt
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,)))
You have an indentation error in your clean method - the return should be outside the for loop.
But don't do this type of validation in the formset. Formset validation is useful when you are validating across forms in the formset. You are comparing values within each form, so it makes more sense to use a custom ModelForm for the formset.
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)
精彩评论