A more complex example

Here is a rather more complex example that uses a number of different input types.

Here's the model.

   1 class User:
   2    def __init__(self):
   3        self.name = ''
   4        self.an_int = 0
   5        self.a_float = 0.0
   6        self.country = 0
   7        self.password = ''
   8        self.active = False

The form that describes how we want it laid out

   1         # Slightly abridged list of all the countries in the world.
   2         country_names = (
   3             'Australia',
   4             'Belgium',
   5             'Cuba',
   6             'Greenland',
   7             'Madagascar',
   8             'Netherlands',
   9             'Switzerland',
  10             'Uzbekistan',
  11             'Zimbabwe'
  12         )
  13         country_menu = [e  for e in enumerate(country_names)]
  14         fields = (
  15             TextField('Name', 'name', required=True),
  16             IntegerField('Integer', 'an_int'),
  17             FloatField('Float', 'a_float'),
  18             SelectField('Country', country_menu, 'country'),
  19             PasswordField('Password', 'password',
  20                           required=True),
  21             Checkbox('Active', 'active'),)
  22         buttons = Buttons((
  23                 Button('save', 'Save'),
  24                 Button('cancel', 'Cancel'),
  25             ))
  26         elements = (Fieldset(fields),)
  27         ctx.locals.test_form = FieldsetForm('User details',
  28                                             elements,
  29                                             buttons=buttons)

Render the form on the page:

That looks like this: attachment:forms-complex-1.png

To render the form as static report:

In the forms.py file, the code looks like:

   1 def page_enter(ctx):
   2     if not ctx.has_value('test_form'):
   3         ctx.locals.description = User()
   4         ctx.add_session_vars('description')
   5         ctx.locals.test_form =
   6 
   7 
   8 def page_display(ctx):
   9     ctx.run_template('forms.html')
  10 
  11 
  12 def page_process(ctx):
  13     if ctx.req_equals('save'):
  14         try:
  15             ctx.locals.test_form.validate()
  16         except FormValidationError, e:
  17             ctx.locals.test_form.disabled = False
  18             return
  19         ctx.locals.test_form.disabled = True
  20         ctx.locals.test_form.merge(ctx.locals.description)
  21     elif ctx.req_equals('reset'):
  22         ctx.locals.test_form.clear()
  23         ctx.locals.test_form.disabled = False
  24     elif ctx.req_equals('cancel'):
  25         if ctx.locals.test_form.disabled:
  26             ctx.locals.test_form.disabled = False
  27         else:
  28             ctx.locals.test_form.clear()
  29             ctx.redirect('main')