Using FormEncode for validation with Colander and Deform
While working on a project, I ran across a number of emails that didn’t properly validate using Colander. Digging into Colander’s code, the regexp used was rather basic. Chris McDonough confirmed this and said he would welcome a newer regexp.
However, FormEncode’s email validation also allows one to optionally check the DNS to see if there is a valid A or MX record – validation that might be handy. Additionally, we need to do credit card verification which is not currently included in Colander. The quick solution is to use FormEncode’s validation routines through Colander.
Our Form Schema:
def email_validate(address): try: valid = formencode.validators.Email().to_python(address) return True except Exception as message: return unicode(message) class EmailTestSchema(colander.Schema): email = colander.SchemaNode(colander.String(), widget = deform.widget.TextInputWidget(size=60), validator = colander.Function(email_validate), )
Our view:
@action(renderer='email_test.mako') def test(self): schema = EmailTestSchema() form = deform.Form(schema, buttons=('Add Email',)) if self.request.POST: try: appstruct = form.validate(self.request.POST.items()) except deform.ValidationFailure, e: return {'form':e.render()} return {'form':form.render()}
Now, our email validation uses FormEncode which contains some fairly detailed error messages which are passed through Colander.
After more coding, I’ll post another solution that might answer some other issues I ran into with email validation.
Tags: colander, deform, formencode, Python