Customising Fields

Here's an example of how we created a MoneyField that knows how to validate a currency (dollar) value. Both parser and formatter are modules that we wrote to convert between formats.

   1 import parser, formatter
   2 
   3 class MoneyField(FloatField):
   4 
   5     def validate(self, form, s):
   6         s = s.strip()
   7         if not self.required and s == '':
   8             return
   9         try:
  10             parser.money(s)
  11         except ValueError, e:
  12             raise FieldValidationError('Invalid value "%s" for money' % s)
  13 
  14     def get_merge_value(self, s):
  15         s = s.strip()
  16         if not self.required and s == '':
  17             return
  18         return parser.money(s)
  19 
  20     def get_display_value(self, ctx, form):
  21         return formatter.money(self.get_value())