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',     'Belgium',      'Cuba',
   4             'Greenland',     'Madagascar',   'Netherlands',
   5             'Switzerland',   'Uzbekistan',   'Zimbabwe'
   6         )
   7         country_menu = [e  for e in enumerate(country_names)]
   8         fields = (
   9             TextField('Name', 'name', required=True),
  10             IntegerField('Integer', 'an_int'),
  11             FloatField('Float', 'a_float'),
  12             SelectField('Country', country_menu, 'country'),
  13             PasswordField('Password', 'password',
  14                           required=True),
  15             Checkbox('Active', 'active'),
  16         )
  17         buttons = Buttons((
  18             Button('Save', 'save'),
  19             Button('Cancel', 'cancel'),
  20         ))
  21         fieldsets = (Fieldset(fields), )
  22         ctx.locals.test_form = FieldsetForm('User details',
  23                                             fieldsets,
  24                                             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 = [see above]
   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.set_disabled(False)
  18             return
  19         ctx.locals.test_form.set_disabled(True)  # This disables the FieldSet!
  20         ctx.locals.test_form.merge(ctx.locals.description)
  21         ...  What now?
  22     elif ctx.req_equals('reset'):
  23         ctx.locals.test_form.clear()
  24         ctx.locals.test_form.set_disabled(False)
  25     elif ctx.req_equals('cancel'):
  26         if ctx.locals.test_form.disabled:
  27             ctx.locals.test_form.set_disabled(False)
  28         else:
  29             ctx.locals.test_form.clear()
  30             ctx.redirect('main')