This is the form template for the example code I gave previously. Note
that the form action is POST to the SAME URL as the original GET
request. This lets you define everything in a single controller action
method (together with the form-handler class and its "process"
method) :
${h.form(h.url_for())}
Email ${h.text('email')} <form:error name="email">
<br>
Email ${h.text('email')} <form:error name="name">
<br>
${h.submit('register', 'Register')}
${h.end_form()}
On Jan 4, 8:21 am, Tycon <[email protected]> wrote:
> The validation "state" can be set using the "validation_ctx" method in
> the FormHandler class. Here's the new handler and decorator:
>
> from pylons.controllers.util import redirect_to
> from pylons.decorators import PylonsFormEncodeState
>
> import decorator
> import formencode
>
> class FormHandler(object):
> def check(self):
> return None
> def defaults(self):
> return request.GET
> def validation_ctx(self):
> return None
> def process(self, result):
> redirect_to(**dict(request.GET))
>
> def validate(schema, handler, **htmlfill_kwargs):
> def wrapper(func, *args, **kwargs):
> errors = handler.check()
> if errors:
> return errors
> if request.method=='GET':
> defaults = handler.defaults()
> else:
> vctx = handler.validation_ctx() or PylonsFormEncodeState
> try:
> result = schema.to_python(request.params.mixed(),
> vctx)
> except formencode.Invalid, e:
> errors = e.unpack_errors()
> if not errors:
> return handler.process(result)
> defaults = request.POST
> #display form
> content = func(*args, **kwargs)
> return formencode.htmlfill.render(content, defaults=defaults,
> errors=errors, **htmlfill_kwargs)
> return decorator.decorator(wrapper)
>
> On Jan 4, 4:48 am, "Mike Orr" <[email protected]> wrote:
>
> > On Sun, Jan 4, 2009 at 3:57 AM, Tycon <[email protected]> wrote:
> > > Using this decorator has greatly simplified my form handling code, so
> > > if there is interest I can publish the source code for this decorator/
> > > handler architecture.
>
> > Yes, please publish it and put a link in ticket
> > #405http://pylonshq.com/project/pylonshq/ticket/405
>
> > There has been a proposal to split @validate into three parts that can
> > be used independently in an action, while still keeping the decorator
> > compatible. Then Mike Bayer proposed a second solution which uses
> > Mako (and may be too much Mako code for a Pylons default?). But we
> > are still looking for other approaches. I use @validate but am not
> > that happy with it. I'm not sure that a validator is even the right
> > solution to this problem, because you can't pass action-specific state
> > through a decorator and that's often the most interesting state (the
> > database record corresponding to the request). One problem with
> > @validate currently is that it mixes code that's part of the basic
> > pattern with code to make the decorator flexible, and that makes it
> > cumbersome to inline "the equivalent code" in an action.
>
> > --
> > Mike Orr <[email protected]>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"pylons-discuss" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/pylons-discuss?hl=en
-~----------~----~----~----~------~----~------~--~---