FormAlchemy eliminates boilerplate by autogenerating HTML input fields from a
given model. FormAlchemy will try to figure out what kind of HTML code should
be returned by introspecting the model’s properties and generate ready-to-use
HTML code that will fit the developer’s application.

Of course, FormAlchemy can’t figure out everything, i.e, the developer might
want to display only a few columns from the given model. Thus, FormAlchemy is
also highly customizable.

Please visit the FormAlchemy’s homepage for documentation and more information:

added the .with_html method to AbstractField which will be
passed to the renderers, allowing to add some HTML attributes to rendered
HTML tags. Removed html_options from render method. (See issue #60)

validators are now passed as second argument the field being validated. WARN:
this will mean adding the parameter to your functions to be backwards compatible.
The validator function signature changed from myfunc(value) to
myfunc(value, field=None).

ext.couchdb now use couchdbkit instead of py-simplecouchdb

added the .with_metadata method to AbstractField which allows
you to add metadata to your field. The difference with .with_html() is that
the attributes passed in will not be rendered in the HTML element, but are there
only to be used in your templates, to tweak the output according to those
properties. See docs/forms.txt

add kwargs to FieldSet and Grid render methods, which are passed
on to the template. this allows easy custom template use w/o having
to subclass. (lbruno)

removed query_options. Just pass the query as the argument to the
options parameter, and FA will turn it into (description, value)
pairs. FA will also accept an iterable of objects as a value to the
options parameter.

unicode(object) is used as the default option description, not
str(object). (Before, unicode was only used if the engine had
convert_unicode turned on.) This is more consistent with normal SA
behavior.

added sanity checks to disallow getting into an inconsistent state.
notably, binding to an object that belongs to a session but does NOT
have a primary key set is not allowed. workaround: bind to the
class, and FA will instantiate it and take it out of the session
[until sync()]. Then you can pull that instance out as the .model
attribute.

sync() will save model to session, if necessary

add Field.with_renderer

allow manually-added fields to pull their value from the bound model

fs.[field] returns the configured version of the field, not the
unconfigured. fs.fields renamed to fs._fields. Added Field.reset()
to deepcopy the unconfigured version.

Added new experimental, little customizable, ‘TableItem’ and
‘TableCollection’. TableItem renders a table from a bound model.
TableCollection renders a table from a collection of items that are of the
same class than the bound model: TableCollection(bind=client,
collection=client_list). The bound model can be a non-instantiated mapped
class.

Removed NullType type column detection for now, as it seems to be a SA 0.4
only thing. What would a NullType HTML field represent anyway?

FieldSet now returns fields embedded in &lt;fieldset&gt; HTML tags.

Implemented the ‘legend’ option for FieldSet to provide an optional and
customizable &lt;legend&gt; tag. FieldSet uses the bound model’s class name as the
legend by default. The legend can be customized by passing a string to the
‘legend’ option: legend=’My legend’. The fieldset can be legend-less by
passing legend=False.

Big core changes. Splitted the single formalchemy.py module into a
formalchemy package. More classes, more flexibility. Plus, we’re now using
model-level and column-level rendering engines: ‘ModelRenderer’ and
‘FieldRenderer’.

‘ModelRender’ and ‘FieldRender’ allows you to render a whole model (like
FieldSet, but without the fieldset/legend tags) or a single column.

FieldSet now uses ‘ModelRenderer’.

Added new experimental, little customizable, non-form related, ‘TableItem’
and ‘TableCollection’. TableItem renders a table from a bound model.
TableCollection renders a table from a collection of items that are of the
same class than the bound model: TableCollection(bind=client,
collection=client_list). The bound model can be a non-instantiated mapped
class.