Form directives =============== In addition to using XML, the tagged values used to control autoform's behavior can instead be set up using "directives" called while defining a schema in Python. Below is an example that exercises the various directives:: from z3c.form.interfaces import IEditForm from plone.supermodel import model from plone.autoform import directives as form from plone.app.z3cform.wysiwyg import WysiwygFieldWidget class IMySchema(model.Schema): # Add a new fieldset and put the 'footer' and 'dummy' fields in it. # If the same fieldset is defined multiple times, the definitions # will be merged, with the label from the first fieldset taking # precedence. model.fieldset('extra', label=u"Extra info", fields=['footer', 'dummy'] ) title = schema.TextLine( title=u"Title" ) summary = schema.Text( title=u"Summary", description=u"Summary of the body", readonly=True ) form.widget(body='plone.app.z3cform.wysiwyg.WysiwygFieldWidget') model.primary('body') body = schema.Text( title=u"Body text", required=False, default=u"Body text goes here" ) form.widget(footer=WysiwygFieldWidget) footer = schema.Text( title=u"Footer text", required=False ) form.omitted('dummy') dummy = schema.Text( title=u"Dummy" ) form.omitted('edit_only') form.no_omit(IEditForm, 'edit_only') edit_only = schema.TextLine( title = u'Only included on edit forms', ) form.mode(secret='hidden') form.mode(IEditForm, secret='input') secret = schema.TextLine( title=u"Secret", default=u"Secret stuff (except on edit forms)" ) form.order_before(not_last='summary') not_last = schema.TextLine( title=u"Not last", ) Here, we have placed the directives immediately before the fields they affect, but they could be placed anywhere in the interface body. All the directives can take multiple values, usually in the form ``fieldname='value'``. The ``omitted()``, ``no_omit``, and ``primary()`` directives take a list of field names instead. The ``widget()`` directive allows widgets to be set either as a dotted name, or using an imported field widget factory. The ``order_before()`` directive has a corresponding ``order_after()`` directive.