Login

newforms: Add field-specific error in form.clean()

Author:
miracle2k
Posted:
July 23, 2007
Language:
Python
Version:
.96
Tags:
newforms forms validation clean
Score:
4 (after 4 ratings)

This is a bit of a hack, but as far as I can see currently the only way to specify a validation error that is specific to a field in form.clean().

I am aware of clean_<fieldname>, but those are difficult to use when the validation process for a field involves other fields as well, because the necessary data might at that point not be yet available in form.cleaned_data.

1
2
3
4
5
6
7
8
def clean(self):	
    try:
        # do validation here
    except ValidationError, e:
        if blame_field:
	    self._errors[blame_field] = e.messages
        else:
            raise e

More like this

  1. Validation for 'unique' and 'unique_together' constraints (different version) by miracle2k 7 years, 7 months ago
  2. Validator for data by limodou 8 years ago
  3. Changing the look of newforms as_table with a custom BaseForm by bikeshedder 7 years, 9 months ago
  4. Newforms Validation of Credit Card Numbers by humphreymurray 6 years, 9 months ago
  5. OpenID Form Field by jpwatts 7 years, 1 month ago

Comments

Archatas (on September 12, 2008):

This is how you can blame different fields for different errors:

def clean(self):
    cleaned = self.cleaned_data
    errors = False

    # ...
    if there_are_errors_for_field1:
        self._errors['field1'] = self._errors.get('field1', [])
        self._errors['field1'].append(_("Field 1 is invalid"))
        errors = True

    # ...
    if there_are_errors_for_field2:
        self._errors['field2'] = self._errors.get('field2', [])
        self._errors['field2'].append(_("Field 2 is invalid"))
        errors = True

    # ...
    non_field_errors = []
    if there_are_other_errors:
        non_field_errors.append(_("Non field error"))
        errors = True

    if errors:
        raise form.ValidationError(non_field_errors)

#

Archatas (on September 12, 2008):

oh.. I forgot to return the cleaned dictionary at the end. so there should be

return cleaned

after all.

#

eopadoan (on July 8, 2009):

Archatas, instead of: self._errors['field1'] = self._errors.get('field1', [])

you should do: self._errors['field1'] = self._errors.get('field1', ErrorList())

ErrorList comes from django.forms.utils

#

Please login first before commenting.