Search code examples
pythondjangodjango-formsdjango-widget

Django custom (multi)widget input validation


What is the correct method for validating input for a custom multiwidget in each of these cases:

  1. if I want to implement a custom Field?
  2. if I want to use an existing database field type (say DateField)?

The motivation for this comes from the following two questions:

  1. How do I use django's multi-widget?
  2. Django subclassing multiwidget

I am specifically interested in the fact that I feel I have cheated. I have used value_from_datadict() like so:

def value_from_datadict(self, data, files, name):

    datelist = [widget.value_from_datadict(data, files, name + '_%s' % i) for i, widget in enumerate(self.widgets)]
    try:   
        D = date(day=int(datelist[0]), month=int(datelist[1]), year=int(datelist[2]))
        return str(D)
    except ValueError:
        return None

Which looks through the POST dictionary and constructs a value for my widget (see linked questions). However, at the same time I've tacked on some validation; namely if the creation of D as a date object fails, I'm returning None which will fail in the is_valid() check.

My third question therefore is should I be doing this some other way? For this case, I do not want a custom field.

Thanks.


Solution

  • You validate your form fields just like any other fields, implementing the clean_fieldname method in your form. If your validation logic spreads across many form fields (which is nto the same as many widgets!) you put it in your form's clean() method.

    http://docs.djangoproject.com/en/1.2/ref/forms/validation/