diff --git a/tailbone/forms2/core.py b/tailbone/forms2/core.py index be67c585..a23470c7 100644 --- a/tailbone/forms2/core.py +++ b/tailbone/forms2/core.py @@ -286,7 +286,7 @@ class Form(object): """ def __init__(self, fields=None, schema=None, request=None, readonly=False, readonly_fields=[], - model_instance=None, model_class=None, nodes={}, enums={}, labels={}, renderers={}, + model_instance=None, model_class=None, nodes={}, enums={}, labels={}, renderers=None, widgets={}, defaults={}, validators={}, required={}, helptext={}, action_url=None, cancel_url=None): @@ -304,7 +304,10 @@ class Form(object): self.nodes = nodes or {} self.enums = enums or {} self.labels = labels or {} - self.renderers = renderers or {} + if renderers is None and self.model_class: + self.renderers = self.make_renderers() + else: + self.renderers = renderers or {} self.widgets = widgets or {} self.defaults = defaults or {} self.validators = validators or {} @@ -334,6 +337,31 @@ class Form(object): return fields + def make_renderers(self): + """ + Return a default set of field renderers, based on :attr:`model_class`. + """ + if not self.model_class: + raise ValueError("Must define model_class to use make_renderers()") + + mapper = orm.class_mapper(self.model_class) + renderers = {} + + for field in self.fields: + if mapper.has_property(field): + prop = mapper.get_property(field) + if isinstance(prop, orm.ColumnProperty): + if len(prop.columns) == 1: + column = prop.columns[0] + + if isinstance(column.type, sa.DateTime): + renderers[field] = self.render_datetime + + elif isinstance(column.type, sa.Boolean): + renderers[field] = self.render_boolean + + return renderers + def append(self, field): self.fields.append(field)