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.

Reply via email to