I'll make a patch for the form schema thing and in my own project try reducing the scope of the htmlfill. Good point, interesting.
I wonder if my destructured @validate [1] as a separate package could serve as as an interim solution. I will experiment, try to get my base.py as close as possible to the vanilla one. Fully agree that it has to go in the longer term (not too long I hope!). I think we will need to share & recommend idioms before we can settle on what belongs inside Pylons. I've not taken the time myself to try other people's approaches; I would be more keen to do so if I thought they stood a chance of being more widely supported. [1] Experimental: Pylons validation (un)decorator with JSON support http://positiveincline.com/?p=621 Regards, Mike On Jun 22, 9:57 pm, Ben Bangert <b...@groovie.org> wrote: > On Jun 22, 2010, at 9:18 AM, Mike Burrows wrote: > > > Yes. Mine is super-simple but it saves a certain amount of needless > > repetition and it means that application code can effectively ignore > > parameter encoding: > > > def fill_render(template_name, values): > > return htmlfill.render(render(template_name), > > variabledecode.variable_encode(values)) > > Unfortunately it parses the entire page, when it only needs to hit the form. > One way I've gone around this in the past is to have a Mako def like this: > <%def name="formfill(content)"> > <% errors = c.form_errors or {} %> > % if not errors and not request.params: > ${content |n} > % else: > ${htmlfill.render(content, request.params.mixed(), errors) | n} > % endif > </%def> > > And then I can wrap the section of the page that has the form with a def, and > when I call it > ${show_form | formfill} > > Which means that only the form section of the whole page gets parsed for form > filling. Of course, this solution requires the use of Mako, vs the more > general htmlfill of the whole rendered output. Though most template languages > do support pluggable filter functions, so its reasonable to assume such an > approach could be used with other template languages. > > > Also: > > > class BaseSchema(formencode.Schema): > > allow_extra_fields = True > > filter_extra_fields = True > > pre_validators = [variabledecode.NestedVariables()] > > > I would have this generated for new projects into lib/base.py. > > Yes, that does seem to be the first thing I always drop into my projects as > well. > > So I should note at this point, I'm kind of torn on how to proceed with the > recommended form handling in Pylons. Which means I'm inclined to remove any > attempt to do form handling from Pylons base itself, and instead have a > Pylons form add-on that implements the recommended form practices, which will > be documented for using with Pylons as well. > > First, the easiest decision to make, @validate has got to go. So it will be > deprecated in future Pylons 1.x releases, and removed in Pylons 2. The main > problem, is that all the ways and things one might want to do with form > validation, are just way too much to cram into a single decorator, and the > fact that there's a gazillion options for @validate backs this up. It's > become a kitchen sink decorator, that is kind of disturbing. > > Second, for the Pylons add-on that streamlines using forms, as its outside > core Pylons itself, I'm more willing to go a little higher level with its > capabilities. That is, having the capability to do some basic form generation > from a schema in addition to validation. The lack of a recommendation for how > to do this in Pylons has resulted in a lot of fragmentation, and I didn't at > the time have very good recommendations because I personally haven't been > very happy with the solutions out there for form generation. > > So my thoughts on where to go, I see two base needs that should be met. > 1. Don't tie people to a specific template language to use it. This means the > form handling library should work within the templating language when its > passed in. > 2. Don't require people to use the form generation library, so that custom > form elements can be dropped in without resorting to customizing widget > templates. > > At the moment, the most appealing option is to use Colander (which is quite > similar to FormEncode, but much better documented), with Deform (form > generation that uses Colander). Since Deform handily will use a Colander form > schema, it means you can easily decide to use just the form validation and > schema, or to have a form generated as well. I'd also include helper > functions to make it easy to spit out appropriate error messages without > using htmlfill to parse an entire page of HTML just to drop in some optional > errors. > > The add-on would come with helpers to streamline validation of forms, > generating them, etc. > > I think an intermediate solution of having a few things to make existing use > of FormEncode easier to use could also be done as an outside package as well. > Perhaps include several helpers that make it easy for people to make a > @validate that isn't a kitchen sink, that does just what they need, and > nothing more. But this stuff definitely doesn't need to be in the Pylons core > package, a namespace package would probably be fine under pylonsext in a > similar manner to how Flask is managing extensions. > > I won't have time to get to the solution I mentioned, so that would be > something good to do in the meantime. I plan on making extensions to Pylons, > and making your own re-usable Pylons bits substantially easier in Pylons 1.1. > > Cheers, > Ben -- You received this message because you are subscribed to the Google Groups "pylons-discuss" group. To post to this group, send email to pylons-disc...@googlegroups.com. To unsubscribe from this group, send email to pylons-discuss+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/pylons-discuss?hl=en.