I have a form with five text input boxes:
form = FORM(*[INPUT('amount-%s' % i, _type='number') for i in range(5)],
INPUT(_type='submit'))
The sum of these input boxes must equal the value of a field in a database
record.
I would like to pass the database record as a parameter to the onvalidation
callback of the form, but as I understand it, this is not possible--the
onvalidation function can only be passed one argument, the function itself.
So, instead, I have written a second function to check validation after the
form passes its initial validation:
def _validate_form(form, record):
total = 0.0
for f in request.vars:
if request.vars[f].startswith('amount-') and request.vars[f] != '':
total += float(request.vars[f])
if total != record.total:
for f in request.vars:
if request.vars[f].startswith('amount-') and request.vars[f] != '':
form.errors[f] = 'total of amounts must equal record total'
return form.errors
def test():
record = db.table[request.args(0)]
form = FORM(*[INPUT('amount-%s' % i, _type='number') for i in
range(5)],INPUT(_type='submit'))
if form.validate():
form.errors = _validate_form(form, record)
if not form.errors:
redirect('next_page')
return form
The trouble I am having is the test--'form.errors' returns True (and hence
'not form.errors' returns False) even when _validate_form returns an empty
form.errors Storage object.
I don't understand why it does. How should I test for this condition
instead?
Is there another way I could do this using the onvalidation function, other
than passing the record id as a hidden form field and doing the record
selection in the validation function? (In my actual application, the
record must be selected before the form is created.)
--
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.