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
-~----------~----~----~----~------~----~------~--~---

Reply via email to