Hi,
I am following the example for TurboGears 1.0 Unified Form Data
Validation :
http://docs.turbogears.org/1.0/UnifiedControllers
I've created a fairly complicated example where the same method
handles an add & edit form using TurboGears 1.0.7 & FormEncode 1.0.1 .
The form layout is dynamic, it depends on user permission and workflow
state to determine the fields that are present and if they are
editable etc.
I am finding I can add an entry if there are no form validation erros
in the form data, but my form falls over when I try to render the form
for correction because the form is getting an internal error from
the validation error.
I know if I suppress rendering of the individual order lines then it
doesn't fall over. Also if I comment out the validate decorator in the
index method, all is well too. Ideally I'd like to catch the error and
have it rendered in line in the form.
Below I've attached the index method of my OrderController, the error
trace for the
Validators are attached to each element in the form as it is built
dynamically.
The template for the order form just has the following rendering code:
<p py:content="form.display(value=form_data, repetitions=repetitions,
formname='Order')">Order Form</p>
My questions for the forum are:
1. Why are validation errors being triggered upon template rendering
after I have already caught them with the get_errors method?
2. Is there a simple way to render the form without triggering the
validation errors?
3. I know there is a CRUD module written for TurboGears 1.0 . Does it
lead to cleaner code than my current index method?
4. Are there any fundamentally better ways of approaching form
validation when dealing with dynamic forms?
Thanks,
Chris Guest
@expose(template="webordering.templates.order_form")
@identity.require(identity.not_anonymous())
def index(self, id='', tg_errors=None, *args, **kw):
plu_classes, plu_classes_data, maxOrderLines, pluClassNum =
self._get_plu_classes()
displayBlankPlu = True
user = identity.current.user
group_names = [g.group_name for g in
identity.current.user.groups]
id = id or kw.get('id','')
if id:
mode, displayBlankPlu, status_code =
self._get_display_options(id, user, group_names)
if kw:
# form data has been posted.
if id:
# edit an existing order
form_args = dict(mode=mode, status_code=form_data
['status_code'], outerRepetitions=pluClassNum,
innerRepetitions=maxOrderLines)
form = get_order_form(**form_args)
else:
# add a new order.
store_id = kw.get('store_id', None)
store_options = self._get_store_options(store_id,
user)
form_args = dict(mode='add', status_code='PEND',
store_options=store_options, outerRepetitions=pluClassNum,
innerRepetitions=maxOrderLines)
form = get_order_form(**form_args)
@validate(form=form)
def get_errors(self, tg_errors=None, **data):
log.info('OrderController.index.get_errors data=
%r'%data)
return tg_errors, data
tg_errors, form_data = get_errors(self, **kw)
# errors = [(param,inv) for param, inv in tg_errors.items
()]
if not tg_errors:
# Perform some action with the data in **data. **kw
still contains the raw data.
flash_message, oh = self._process(*args, **form_data)
flash(flash_message)
redirect(oh.get_url().replace('/order',''))
else:
if id:
flash("Errors were encountered.")
params = self._edit(plu_classes_data, mode, id,
form_data, displayBlankPlu, *args, **kw)
else:
flash("Errors were encountered.")
params = self._add(plu_classes_data, form_data,
displayBlankPlu, *args, **kw)
params['template'] =
'webordering.templates.order_form'
else:
# no data posted
form_data = None
if id:
# edit - retrieve record from database.
params = self._edit(plu_classes_data, mode, id,
form_data, displayBlankPlu, *args, **kw)
else:
# new - enter blank form.
params = self._add(plu_classes_data, form_data,
displayBlankPlu, *args, **kw)
log.info('OrderController.index -> else: type=%r'%type
(params))
if 'makeInvoiceURL' not in params:
params['makeInvoiceURL'] = False
params.update(get_sidebars())
return params
500 Internal error
The server encountered an unexpected condition which prevented it from
fulfilling the request.
Page handler: <bound method OrderController.index of
<webordering.controllers.OrderController object at 0xb745096c>>
Traceback (most recent call last):
File "/usr/local/lib/python2.4/site-packages/CherryPy-2.3.0-
py2.4.egg/cherrypy/_cphttptools.py", line 121, in _run
self.main()
File "/usr/local/lib/python2.4/site-packages/CherryPy-2.3.0-
py2.4.egg/cherrypy/_cphttptools.py", line 264, in main
body = page_handler(*virtual_path, **self.params)
File "<string>", line 3, in index
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/controllers.py", line 358, in expose
output = database.run_with_transaction(
File "<string>", line 5, in run_with_transaction
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/database.py", line 407, in sa_rwt
retval = func(*args, **kw)
File "<string>", line 5, in _expose
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/controllers.py", line 373, in <lambda>
mapping, fragment, args, kw)))
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/controllers.py", line 423, in _execute_func
return _process_output(output, template, format, content_type,
mapping, fragment)
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/controllers.py", line 88, in _process_output
fragment=fragment)
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/view/base.py", line 161, in render
return engine.render(**kw)
File "/usr/local/lib/python2.4/site-packages/TurboKid-1.0.4-
py2.4.egg/turbokid/kidsupport.py", line 206, in render
output=output, format=format)
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
__init__.py", line 301, in serialize
raise_template_error(module=self.__module__)
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
__init__.py", line 299, in serialize
return serializer.serialize(self, encoding, fragment, format)
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
serialization.py", line 107, in serialize
text = ''.join(self.generate(stream, encoding, fragment, format))
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
serialization.py", line 629, in generate
for ev, item in self.apply_filters(stream, format):
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
serialization.py", line 165, in format_stream
for ev, item in stream:
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 221, in _coalesce
for ev, item in stream:
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
serialization.py", line 477, in inject_meta_tags
for ev, item in stream:
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 179, in _track
for p in stream:
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
filter.py", line 41, in apply_matches
templates[:i] + templates[i+1:], apply_func):
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
filter.py", line 41, in apply_matches
templates[:i] + templates[i+1:], apply_func):
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
filter.py", line 26, in apply_matches
for ev, item in stream:
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 179, in _track
for p in stream:
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 221, in _coalesce
for ev, item in stream:
File "/home/chris/sup1/WebOrdering/webordering/templates/
order_form.py", line 56, in _match_func
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/meta.py", line 110, in lockwidget
output = self.__class__.display(self, *args, **kw)
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/base.py", line 387, in display
return super(CompoundWidget, self).display(value, **params)
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/forms.py", line 52, in _update_path
returnval = func(self, *args, **kw)
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/forms.py", line 237, in display
return super(InputWidget, self).display(value, **params)
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/base.py", line 294, in display
return transform(params, self.template_c)
File "/usr/local/lib/python2.4/site-packages/TurboKid-1.0.4-
py2.4.egg/turbokid/kidsupport.py", line 220, in transform
return kid.ElementStream(t.transform()).expand()
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 108, in expand
for ev, item in self._iter:
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 179, in _track
for p in stream:
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 179, in _track
for p in stream:
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
filter.py", line 26, in apply_matches
for ev, item in stream:
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 179, in _track
for p in stream:
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 221, in _coalesce
for ev, item in stream:
File "<string>", line 85, in _pull
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/meta.py", line 110, in lockwidget
output = self.__class__.display(self, *args, **kw)
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/base.py", line 387, in display
return super(CompoundWidget, self).display(value, **params)
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/forms.py", line 52, in _update_path
returnval = func(self, *args, **kw)
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/forms.py", line 237, in display
return super(InputWidget, self).display(value, **params)
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/base.py", line 294, in display
return transform(params, self.template_c)
File "/usr/local/lib/python2.4/site-packages/TurboKid-1.0.4-
py2.4.egg/turbokid/kidsupport.py", line 220, in transform
return kid.ElementStream(t.transform()).expand()
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 108, in expand
for ev, item in self._iter:
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 179, in _track
for p in stream:
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 179, in _track
for p in stream:
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
filter.py", line 26, in apply_matches
for ev, item in stream:
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 179, in _track
for p in stream:
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 221, in _coalesce
for ev, item in stream:
File "<string>", line 92, in _pull
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/base.py", line 387, in display
return super(CompoundWidget, self).display(value, **params)
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/forms.py", line 52, in _update_path
returnval = func(self, *args, **kw)
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/forms.py", line 237, in display
return super(InputWidget, self).display(value, **params)
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/base.py", line 294, in display
return transform(params, self.template_c)
File "/usr/local/lib/python2.4/site-packages/TurboKid-1.0.4-
py2.4.egg/turbokid/kidsupport.py", line 220, in transform
return kid.ElementStream(t.transform()).expand()
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 108, in expand
for ev, item in self._iter:
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 179, in _track
for p in stream:
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 179, in _track
for p in stream:
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
filter.py", line 26, in apply_matches
for ev, item in stream:
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 179, in _track
for p in stream:
File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 221, in _coalesce
for ev, item in stream:
File "<string>", line 104, in _pull
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/forms.py", line 52, in _update_path
returnval = func(self, *args, **kw)
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/forms.py", line 237, in display
return super(InputWidget, self).display(value, **params)
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/base.py", line 280, in display
params["value"] = to_unicode(self.adjust_value(value, **params))
File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/forms.py", line 233, in adjust_value
value = self.validator.from_python(value)
File "/usr/local/lib/python2.4/site-packages/FormEncode-1.0.1-
py2.4.egg/formencode/api.py", line 418, in from_python
value = self._from_python(value, state)
File "/usr/local/lib/python2.4/site-packages/FormEncode-1.0.1-
py2.4.egg/formencode/validators.py", line 948, in _to_python
value, state)
Invalid: Please enter an integer value
Error location in template file '/home/chris/sup1/WebOrdering/
webordering/templates/order_form.kid'
between line 10, column 4 and line 11, column 4:
<p py:content="form.display(value=form_data,
repetitions=repetitions, f ...
Powered by CherryPy 2.3.0
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"TurboGears" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/turbogears?hl=en
-~----------~----~----~----~------~----~------~--~---