On hindsight my suggested fix to sqlhtml.py does not work. It does
return the values as a list but the values are not inserted into the
db properly.

On Aug 11, 10:27 am, Eric Enns <ee...@seccuris.com> wrote:
> Hey,
>
> There are quite a few bugs in SQLFORM when having a field of type 'list' (so 
> 'list:string', 'list:integer'). First one being when you submit and form and 
> there are error's with other fields.
>
> def error_form():
>                 form = SQLFORM(
>                                 Field('string', 'string'),
>                                 Field('list', 'list:string'))
>
>                 if form.accepts(request.vars, session, 
> onvalidation=_force_string_error):
>                                 pass
>
>                 return dict(form=form)
>
> def _force_string_error(form):
>                 form.errors.string = "blah blah"
>
> Submitting this form with list being one entry equal to "abc" (so one box, no 
> empty box after) will cause on return "abc" being iterated and each value 
> going into its own box (so three boxes for list on the form).
>
> I do have a solution for this, it involves modifying gluon/sqlhtml.py (fixes 
> involve latest web2py download). The following code can be added after line 
> 1061:
>
> for fieldname in self.vars:
> field = self.table[fieldname]
> value = self.vars[fieldname]
> if field.type.startswith('list:') and not isinstance(field, (tuple, list)):
> self.vars[fieldname] = value and [value] or []
>
> Or in the controller we could have the following:
>
> def error_form():
>                 form = SQLFORM(
>                                 Field('string', 'string'),
>                                 Field('list', 'list:string'))
>
>                 if form.accepts(request.vars, session, 
> onvalidation=_force_string_error):
>                                 pass
>                 elif form.errors:
>                                 if not isinstance(form.vars['list'], (tuple, 
> list)):
>                                                 form.vars['list'] = 
> form.vars['list'] and [form.vars['list']] or []
>
>                 return dict(form=form)
>
> The second bug is you cannot set form.errors for a field with type list. I do 
> not have a web2py fix for this but I do the following:
>
> def error_form():
>                 form = SQLFORM(
>                                 Field('string', 'string'),
>                                 Field('list', 'list:string'))
>
>                 if form.accepts(request.vars, session, 
> onvalidation=[_force_string_error, _force_list_error]):
>                                 pass
>                 elif form.errors:
>                                 if not isinstance(form.vars['list'], (tuple, 
> list)):
>                                                 form.vars['list'] = 
> form.vars['list'] and [form.vars['list']] or []
>                                 if form.errors.haskey('list'):
>                                                 
> form.element(_id='no_table_list__row')[1].append(DIV(form.errors.list, 
> _class='error'))
>
>                 return dict(form=form)
>
> def _force_list_error(form):
>                 form.errors.list = "blah blah"
>
> Looking to see what Massimo thinks, and also what the rest of the community 
> think and/or if you have encountered this issue yourself.
>
> -Eric
>
> 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