I've been doing things like this in the clean method:
if self.cleaned_data['type'].organized_by != self.cleaned_data['organized_by']:
raise forms.ValidationError('The type and organization do not match.')
if self.cleaned_data['start'] > self.cleaned_data['end']:
raise forms.ValidationError('The start date cannot be later than the end date.')
But then that means that the form can only raise one of these errors at a time. Is there a way for the form to raise both of these errors?
EDIT #1: Any solutions for the above are great, but would love something that would also work in a scenario like:
if self.cleaned_data['type'].organized_by != self.cleaned_data['organized_by']:
raise forms.ValidationError('The type and organization do not match.')
if self.cleaned_data['start'] > self.cleaned_data['end']:
raise forms.ValidationError('The start date cannot be later than the end date.')
super(FooAddForm, self).clean()
Where FooAddForm is a ModelForm and has unique constraints that might also cause errors. If anyone knows of something like that, that would be great...
Although its old post, if you want less code you can use
add_error()
method to add error messages. I am extending the @kemar's answer to show the used case:add_error()
automatically removes the field from cleaned_data dictionary, you dont have to delete it manually. Also you dont have to import anything to use this.documentation is here
From the docs:
https://docs.djangoproject.com/en/1.7/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other
If you'd prefer that the error messages be attached to the form rather than to specific fields, you can use the key "
__all__
" like this:Also, as the Django docs explain: "if you want to add a new error to a particular field, you should check whether the key already exists in
self._errors
or not. If not, create a new entry for the given key, holding an emptyErrorList
instance. In either case, you can then append your error message to the list for the field name in question and it will be displayed when the form is displayed."