Works for me. -----Original Message----- From: web2py@googlegroups.com [mailto:web...@googlegroups.com] On Behalf Of mdipierro Sent: Thursday, November 25, 2010 10:01 PM To: web2py-users Subject: [web2py] Re: Possible BUG: Hidden fields in SQLFORM with custom render template
I like this. I will give some thought to it and this should be probably be made the default web2py behavior. Any objection? On Nov 25, 4:49 pm, Josh Jaques <jjaq...@seccuris.com> wrote: > Hey guys, > > I looked into this a little more. > > The problem seems to be that self.custom.begin and self.custom.end are > computed as soon as the form is initialized, and the hidden fields get > appended to self.custom.end only in the call to accepts. > > For this same reason, I was also having problems setting a class on a form > with a custom template using code like the following: > form = crud.read(db.table, id) > form["_class"] = "some class" > > The class is set after the form is created, and hence never shows up in > self.custom.begin. > > I'm using a quick work around by defining the following simple classes: > > # lets you add attributes after initialization to forms rendered with custom > templates > class CustomFormBeginner(DIV): > def __init__(self, form): > self.form = form > def xml(self): > (begin, end) = self.form._xml() > return "<%s %s>" % (self.form.tag, begin) > > # ensures the hidden_field() are present on every form, regardless if accepts > has been called > class CustomFormEnder(DIV): > def __init__(self, form): > self.form = form > def xml(self): > return "%s</%s>" % (self.form.hidden_fields().xml(), > self.form.tag) > > And then externally set the form.custom.begin and form.custom.end at creation > time like so: > form = crud.read(db.table, id) > form["_class"] = "some class" > > form.custom.begin = CustomFormBeginner(form) > form.custom.end = CustomFormEnder(form) > > This seems to solve the problem, and doesn't seem to break anything in the > testing I've done. > > Josh Jaques > Intern > > From: web2py@googlegroups.com [mailto:web...@googlegroups.com] On Behalf Of > Josh Jaques > Sent: Tuesday, November 23, 2010 10:35 AM > To: web2py@googlegroups.com > Subject: [web2py] Possible BUG: Hidden fields in SQLFORM with custom render > template > > Rendering SQLFORMs with a custom template, any hidden fields I create, as > well as the hidden ID field are not displayed in the form until a call to > accepts. > > I think this might be a bug because the same form rendered without a custom > template will have the ID and hidden fields without calling accepts. > > I tested against latest release. > > Thoughts? > > Sample controller action: > def index(): > form = SQLFORM(db.images, db.images(1), > hidden=dict(test_field="test_value")) > accepted_form = SQLFORM(db.images, db.images(1), > hidden=dict(test_field="test_value")) > accepted_form.accepts(request.vars, formname=None) > return dict(form=form, accepted_form=accepted_form) > > Sample view: > <!-- RENDER WITHOUT A TEMPLATE --> > {{=form}} > > <!-- RENDER WITH A TEMPLATE --> > {{=form.custom.begin}} > Image name: <div>{{=form.custom.widget.name}}</div> > Image file: <div>{{=form.custom.widget.file}}</div> > Click here to upload: {{=form.custom.submit}} > {{=form.custom.end}} > > <!-- RENDER WITH TEMPLATE AFTER ACCEPTS --> > {{form=accepted_form}} > {{=form.custom.begin}} > Image name: <div>{{=form.custom.widget.name}}</div> > Image file: <div>{{=form.custom.widget.file}}</div> > Click here to upload: {{=form.custom.submit}} > > {{=form.custom.end}} > > Sample output: > > <!-- RENDER WITHOUT A TEMPLATE --> > > <form action="" enctype="multipart/form-data" method="post"><table><tr > id="images_id__row"><td class="w2p_fl"><label for="images_id" > id="images_id__label">Id: </label></td><td class="w2p_fw"><span > id="images_id">1</span></td><td class="w2p_fc"></td></tr><tr > id="images_name__row"><td class="w2p_fl"><label for="images_name" > id="images_name__label">Name: </label></td><td class="w2p_fw"><input > class="string" id="images_name" name="name" type="text" value="a" /></td><td > class="w2p_fc"></td></tr><tr id="images_file__row"><td class="w2p_fl"><label > for="images_file" id="images_file__label">File: </label></td><td > class="w2p_fw"><input class="upload" id="images_file" name="file" type="file" > /></td><td class="w2p_fc"></td></tr><tr id="submit_record__row"><td > class="w2p_fl"></td><td class="w2p_fw"><input type="submit" value="Submit" > /></td><td class="w2p_fc"></td></tr></table><div class="hidden"><input > name="test_field" type="hidden" value="test_value" /><input name="id" > type="hidden" value="1" /></div></form> > > <!-- RENDER WITH A TEMPLATE --> > > <form action="" enctype="multipart/form-data" method="post"> > > Image name: <div><input class="string" id="images_name" name="name" > type="text" value="a" /></div> > > Image file: <div><input class="upload" id="images_file" name="file" > type="file" /></div> > > Click here to upload: <input type="submit" value="Submit" /> > > </form> > > <!-- RENDER WITH TEMPLATE AFTER ACCEPTS --> > > <form action="" enctype="multipart/form-data" method="post"> > > Image name: <div><input class="string" id="images_name" name="name" > type="text" value="" /><div class="error" id="name__error">enter from 10 to > 255 characters</div></div> > > Image file: <div><input class="upload" id="images_file" name="file" > type="file" /></div> > > Click here to upload: <input type="submit" value="Submit" /> > > <div class="hidden"><input name="test_field" type="hidden" value="test_value" > /><input name="id" type="hidden" value="1" /></div></form> > > This communication, including any attachments, does not necessarily represent > official policy of Seccuris Inc. > Please seehttp://www.seccuris.com/Contact-PrivacyPolicy.htmfor further > details about Seccuris Inc.'s Privacy Policy. > If you have received this communication in error, please notify Seccuris Inc. > at i...@seccuris.com<mailto:i...@seccuris.com> or at 1-866-644-8442. > > This communication, including any attachments, does not necessarily represent > official policy of Seccuris Inc. > Please seehttp://www.seccuris.com/Contact-PrivacyPolicy.htm for further > details about Seccuris Inc.'s Privacy Policy. > If you have received this communication in error, please notify Seccuris Inc. > at i...@seccuris.com or at 1-866-644-8442. This communication, including any attachments, does not necessarily represent official policy of Seccuris Inc. Please see http://www.seccuris.com/Contact-PrivacyPolicy.htm for further details about Seccuris Inc.'s Privacy Policy. If you have received this communication in error, please notify Seccuris Inc. at i...@seccuris.com or at 1-866-644-8442.