Differences between revisions 9 and 11 (spanning 2 versions)
Revision 9 as of 2010-07-31 04:46:54
Size: 2910
Editor: vortex
Comment:
Revision 11 as of 2011-02-15 06:05:17
Size: 3109
Editor: localhost
Comment: converted to 1.6 markup
Deletions are marked like this. Additions are marked like this.
Line 55: Line 55:
attachment:forms-complex-1.png {{attachment:forms-complex-1.png}}
Line 86: Line 86:
        # update the values in the model from the form
Line 87: Line 88:
        ... What now?         # now you can do things with the updated object, eg
        ctx.log('user %s, active %s' % (ctx.locals.description.user, ctx.locals.description.active))

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:

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         # update the values in the model from the form
  21         ctx.locals.test_form.merge(ctx.locals.description)
  22         # now you can do things with the updated object, eg
  23         ctx.log('user %s, active %s' % (ctx.locals.description.user, ctx.locals.description.active))
  24     elif ctx.req_equals('reset'):
  25         ctx.locals.test_form.clear()
  26         ctx.locals.test_form.set_disabled(False)
  27     elif ctx.req_equals('cancel'):
  28         if ctx.locals.test_form.disabled:
  29             ctx.locals.test_form.set_disabled(False)
  30         else:
  31             ctx.locals.test_form.clear()
  32             ctx.redirect('main')

None: A_more_complex_example (last edited 2011-02-15 06:05:17 by localhost)