Bases: flatland.schema.containers.Dict
A declarative collection of named fields.
Forms behave like flatland.Dict, but are defined with Python class syntax:
>>> from flatland import Form, String
>>> class HelloForm(Form):
... hello = String
... world = String
...
Fields are assigned names from the declaration. If a named schema is used, a renamed copy will be assigned to the Form.
>>> class HelloForm(Form):
... hello = String.named('hello') # redundant
... world = String.named('goodbye') # will be renamed 'world'
...
>>> form = HelloForm()
>>> sorted(form.keys())
[u'hello', u'world']
Forms may embed other container fields and other forms:
>>> from flatland import List
>>> class BigForm(Form):
... main_hello = HelloForm
... alt_hello = List.of(String.named('alt_name'),
... HelloForm.named('alt_hello'))
...
This would create a form with one HelloForm embedded as main_hello, and a list of zero or more dicts, each containing an alt_name and another HelloForm named alt_hello.
Forms may inherit from other Forms or Dicts. Field declared in a subclass will override those of a superclass. Multiple inheritance is supported.
The special behavior of Form is limited to class construction time only. After construction, the Form acts exactly like a Dict. In particular, fields declared in class attribute style do not remain class attributes. They are removed from the class dictionary and placed in the field_schema:
>>> hasattr(HelloForm, 'hello')
False
>>> sorted([field.name for field in HelloForm.field_schema])
[u'hello', u'world']
The order of field_schema after construction is undefined.