Try setting db.yourtable.postcode.default to the value returned by the
validator under the elif form.errors part of the code.


On May 17, 4:58 am, jc <[email protected]> wrote:
> Hello,
>
> I want a custom validator which, amongst other things, translates
> alpha characters to upper case. I want a partly validated value to be
> displayed back in the form, but in its uppercased form, when
> validation fails.
>
> I am using the usual:
>     if form.accepts(request.vars, session):
>         response.flash = 'form accepted'
>     elif form.errors:
>         response.flash = 'Please correct the errors in the form'
>     else:
>         response.flash = 'Please fill out the application'
>     return dict(form=form)
>
> processing of the form - an SQLFORM as it happens.
>
> Here is my validator which I have shamelessly copied from django:
>
> # uk postcode validator
> class IS_UK_POSTCODE(object):
>     import re
>     outcode_pattern = '[A-PR-UWYZ]([0-9]{1,2}|([A-HIK-Y][0-9](|[0-9]|
> [ABEHMNPRVWXY]))|[0-9][A-HJKSTUW])'
>     incode_pattern = '[0-9][ABD-HJLNP-UW-Z]{2}'
>     postcode_regex = re.compile(r'^(GIR 0AA|%s %s)$' %
> (outcode_pattern, incode_pattern))
>     space_regex = re.compile(r' *(%s)$' % incode_pattern)
>
>     def __init__(self, error_message='Must be valid UK postcode'):
>         self.error_message = error_message
>
>     def __call__(self, value):
>         postcode = value.upper().strip()
>         # Put a single space before the incode (second part).
>         postcode = self.space_regex.sub(r' \1', postcode)
>         if not self.postcode_regex.search(postcode):
>             return postcode, self.error_message
>         else:
>             return postcode, None
>
> As you can see I don't return the input value, I return the uppercased
> value (value.upper().strip()). However I can't get that uppercased
> fragment back into the form.
>
> When I run my controller, and type a partial postcode (e.g. 'se1') in
> the field in lower case, I correctly get a validation error, and the
> incorrect partial postcode is displayed back in the form. I want to
> have the uppercased partial value displayed ('SE1'). I have tried, in
> my elif form.errors: branch, to change form.vars.postcode to the
> uppercased value. I have also tried return dict(form=form,
> form.vars.postcode=value) where value is my uppcased fragment. None of
> these work. Is there an easy way?
>
> Thanks for any assistance.

Reply via email to