diff --git a/pyramid_simpleform/__init__.py b/pyramid_simpleform/__init__.py index b5aff63..a07d65b 100644 --- a/pyramid_simpleform/__init__.py +++ b/pyramid_simpleform/__init__.py @@ -112,10 +112,13 @@ def __init__(self, request, schema=None, validators=None, defaults=None, self.data.update(defaults) if obj: - fields = self.schema.fields.keys() + self.validators.keys() - for f in fields: - if hasattr(obj, f): - self.data[f] = getattr(obj, f) + fields = itertools.chain(self.schema.fields.iteritems(), self.validators.iteritems()) + for name, validator in fields: + if hasattr(obj, name): + try: + self.data[name] = validator.from_python(getattr(obj, name) ) + except Invalid as e: + self.data[name] = getattr(obj, name) def is_error(self, field): """ @@ -192,7 +195,8 @@ def validate(self, force_validate=False, params=None): if self.schema: try: - self.data = self.schema.to_python(decoded, self.state) + self.data = self.schema.from_python(self.schema.to_python(decoded, self.state), self.state) + except Invalid, e: self.errors = e.unpack_errors(self.variable_decode, self.dict_char, @@ -201,8 +205,8 @@ def validate(self, force_validate=False, params=None): if self.validators: for field, validator in self.validators.iteritems(): try: - self.data[field] = validator.to_python(decoded.get(field), - self.state) + self.data[field] = validator.from_python(validator.to_python(decoded.get(field), + self.state), self.state) except Invalid, e: self.errors[field] = unicode(e) @@ -239,6 +243,7 @@ def bind(self, obj, include=None, exclude=None): raise RuntimeError, "Cannot bind to object if form has errors" items = [(k, v) for k, v in self.data.items() if not k.startswith("_")] + fields = dict(itertools.chain(self.schema.fields.iteritems(), self.validators.iteritems())) for k, v in items: if include and k not in include: @@ -246,6 +251,8 @@ def bind(self, obj, include=None, exclude=None): if exclude and k in exclude: continue + + v = fields[k].to_python(v) setattr(obj, k, v)