Because onfailure
def validateTerms(form):
if form.vars.terms != 'agree':
form.errors.terms = 'You must agree to the terms.'
must be
def validateTerms(form):
if request.vars.terms != 'agree':
form.errors.terms = 'You must agree to the terms.'
as the request.vars has not yet been copied into form.vars.... I
think.
On Apr 14, 8:18 am, Brian Will <[email protected]> wrote:
> I'm trying to add a checkbox that must be ticked to an update SQLFORM,
> but I'm getting an internal error.
>
> Here's the create form that works fine with an added checkbox:
>
> form = SQLFORM(db.job_post, submit_button='Post Job',
> formstyle='table2cols',
> fields=['poster_name', 'poster_email', 'poster_phone',
> 'zipcode', 'job_type', 'job_title', 'job_description'],
> _id='postjob',
> _class='form2col'
> )
> form[0].insert(-2, TR(SPAN(LABEL('I agree to the ', A('terms of
> service', _href=URL('terms'))), INPUT(_name='terms', _value='agree',
> _type='checkbox', _style="margin: 0px 0px 4px 14px")))) # add
> checkbox
>
> def validateTerms(form):
> if form.vars.terms != 'agree':
> form.errors.terms = 'You must agree to the terms.'
>
> if form.accepts(request.vars, session, onvalidation={'onsuccess':
> validateTerms, 'onfailure': validateTerms}):
> # bla bla
>
> Now on another page here's virtually the same thing but an update
> form:
>
> form = SQLFORM(db.job_post, job.id, submit_button='Update Job',
> formstyle='table2cols',
> fields=['poster_name', 'poster_email', 'poster_phone',
> 'zipcode', 'job_type', 'job_title', 'job_description'],
> _id='postjob',
> _class='form2col'
> )
> form[0].insert(-2, TR(SPAN(LABEL('I agree to the ', A('terms
> of service', _href=URL('terms'))), INPUT(_name='terms',
> _value='agree', _type='checkbox', _style="margin: 0px 0px 4px
> 14px")))) # add checkbox
>
> def validateTerms(form):
> if form.vars.terms != 'agree':
> form.errors.terms = 'You must agree to the terms.'
>
> if form.accepts(request.vars, session,
> onvalidation={'onsuccess': validateTerms, 'onfailure':
> validateTerms}):
> # bla bla
>
> And here's the ticket I get with this second form:
>
> Traceback (most recent call last):
> File "/home/www-data/web2py/gluon/restricted.py", line 188, in
> restricted
> exec ccode in environment
> File "/home/www-data/web2py/applications/staging/controllers/
> default.py", line 329, in <module>
> File "/home/www-data/web2py/gluon/globals.py", line 124, in <lambda>
> self._caller = lambda f: f()
> File "/home/www-data/web2py/applications/staging/controllers/
> default.py", line 119, in post_edit
> if form.accepts(request.vars, session, onvalidation={'onsuccess':
> validateTerms, 'onfailure': validateTerms}):
> File "/home/www-data/web2py/gluon/sqlhtml.py", line 1042, in accepts
> if self.table[key].type == 'upload' \
> File "/home/www-data/web2py/gluon/dal.py", line 4320, in __getitem__
> return dict.__getitem__(self, str(key))
> KeyError: 'terms'
>
> Looking at sqlhtml.py line 1042, I see there's a check done for update
> forms that involves looking for every entry in self.errors in
> self.table, which of course won't be found here because my checkbox is
> not part of the table.
>
> If I comment out the assignment to form.errors.terms, I don't get this
> error, but of course then I don't get the validation I want. Also, I
> strangely then get a 'no data' error message for the first field when
> I visit the page but no such error when I submit the form. If I remove
> the onvalidation arg from accepts, this error goes away entirely.
>
> So any ideas? Am I doing things wrong or is there some bug here?