I usually like best a more declarative approach. It is more readable IMO. From one of my apps:

class ModifyMailboxForm(widgets.TableForm):
    fields = MailboxCommonFields() + [
        widgets.CheckBox(
            name = "change_password",
            label = _("Change password"),
        ),
        PasswordFieldSet('password'),
    ]
    validator = V.MailboxSchema(condition_field = "change_password")
    submit_text = _("Modify Mailbox")

MailboxCommonFields is a WidgetsDeclaration which I use in other forms too:

class MailboxCommonFields(widgets.WidgetsDeclaration):
    id = W.IdField()
    email = W.EmailWithAutoDomainField(
        label =_('E-mail Address'),
        search_controller = turbogears.url("/dominios"),
    )
    cuota = widgets.TextField(
        validator = validators.Int(),
        label = _('Mailbox quota'),
        template = '<span>' + widgets.TextField.template +
'<span class="${field_class}_size">MegaBytes</ span></span>',
    )

This way the form is created by instantiating a ModifyMailboxForm instance:
form = ModifyMailboxForm()
which can be customized dynamically by overriding at the constructor:
form2 = ModifyMailboxForm(submit_text="Just submit")

Just a matter of style I guess :)
Alberto

On Feb 14, 2006, at 5:21 PM, Randall wrote:


I'm interested in hearing people's approaches to creating form widgets
and feedback on the approach I've been taking.  I've used the
traditional approach rather than the declarative approach because I
often have more logic than would fit into a single declaration and
because Kevin has stated he prefers the traditional approach.  I also
wrap my form creation up in a function to keep the namespace clean and
make form creation callable since many of my forms are populated with
live data.  Here is an example:

def createReviewerForm(controller=None):
    criteria = Permission.q.permissionId.endswith('reviewer')
    reviewer_permissions = Permission.select(criteria)
    criteria = Permission.q.permissionId.endswith('writer')
    writer_permissions = Permission.select(criteria)
    def usersForPermissions(permissions):
        options = [(None, '')]
        for permission in permissions:
            users = permission.all_users
            for user in users:
                user_tuple = (user.id, user.name or '')
                if user_tuple not in users:
                    options.append(user_tuple)
        return options
    reviewers = usersForPermissions(reviewer_permissions)
    writers = usersForPermissions(writer_permissions)
    permissions = [(None, '')]
    permissions.extend([(x.id, x.permissionId) for x in
reviewer_permissions])
    reviewer_wgt = DataSelectField(name="reviewer", options=reviewers)
    writer_wgt = DataSelectField(name="writer", options=writers)
    permission_wgt = DataSelectField(name="permission",
options=permissions)
    reviewer_wgt.validator = validators.NotEmpty()
    writer_wgt.validator = validators.NotEmpty()
    permission_wgt.validator = validators.NotEmpty()
    form_widgets = [reviewer_wgt, writer_wgt, permission_wgt]
    reviewer_form = WSTableForm(form_widgets, submit_text="Save")
    return reviewer_form

Some notes.  WSTableForm is a subclass of TableForm.  Permission is an
SQLObject subclass.  I don't know what the controller argument in the
function is.  I just know I had to put it in there to work.  Any
feedback or suggestions is welcome.

Randall


Reply via email to