Ticket #2462 (closed defect: invalid)
member variable in Form called 'method', causing exception
| Reported by: | rmancy | Owned by: | |
|---|---|---|---|
| Priority: | normal | Milestone: | 1.0.x bugfix |
| Component: | TG Widgets | Version: | 1.0.8 |
| Severity: | normal | Keywords: | |
| Cc: |
Description
TurboGears 1.0.8 Python 2.4.3
I have this widget. It does not seem to work because of the 'self.method' member variable. I get the stacktrace below
class ReserveWorkflow(Form):
member_widgets = ['method']
params = []
template="beaker.server.templates.reserve_workflow"
def __init__(self,*args,**kw):
super(ReserveWorkflow,self).__init__(*args, **kw)
self.method = SingleSelectField(name='method', label='Method', options=[(-1,'None')] + [(elem,elem) for elem in model.Distro.all_methods()])
raceback (most recent call last):
File "/usr/lib/python2.4/site-packages/cherrypy/_cphttptools.py", line 121, in _run
self.main()
File "/usr/lib/python2.4/site-packages/cherrypy/_cphttptools.py", line 264, in main
body = page_handler(*virtual_path, **self.params)
File "<string>", line 3, in index
File "/usr/lib/python2.4/site-packages/turbogears/controllers.py", line 358, in expose
output = database.run_with_transaction(
File "<string>", line 5, in run_with_transaction
File "/usr/lib/python2.4/site-packages/turbogears/database.py", line 410, in sa_rwt
retval = func(*args, **kw)
File "<string>", line 5, in _expose
File "/usr/lib/python2.4/site-packages/turbogears/controllers.py", line 373, in <lambda>
mapping, fragment, args, kw)))
File "/usr/lib/python2.4/site-packages/turbogears/controllers.py", line 410, in _execute_func
output = errorhandling.try_call(func, *args, **kw)
File "/usr/lib/python2.4/site-packages/turbogears/errorhandling.py", line 77, in try_call
return func(self, *args, **kw)
File "/home/raymond/dev/Beaker/test3/Server/beaker/server/reserve_workflow.py", line 13, in index
widget = ReserveWorkflowWidget()
File "/usr/lib/python2.4/site-packages/turbogears/widgets/meta.py", line 175, in widget_init
validator = generate_schema(self.validator, widgets)
File "/usr/lib/python2.4/site-packages/turbogears/widgets/meta.py", line 283, in generate_schema
if widget.is_named:
AttributeError: 'Element' object has no attribute 'is_named'
Now if I change it to 'self.method_' (notice the trailing underscore) and obviously change the corersponding entry in member_widgets and in the template, then it works fine.
Not sure what the problem is. Maybe something to do with the iter_member_widgets generator object ??
Change History
comment:2 Changed 2 years ago by rmancy
Thanks for the explanation. I thought something like this must've been happening and I must have been overwriting a name that was already being used. Thanks again, sorry for the bother
Note: See
TracTickets for help on using
tickets.
If you take a look on Form's class definition:
class Form(FormFieldsContainer): form = True name = "form" member_widgets = ["submit"] params = ["action", "method", "form_attrs", "use_name", "submit_text"]You can see that method already defined as widget's parameter. Parameters can be not just a value, but a callable object. If parameter is callable it will be called _before_ passing to widget's template. Also it will be called when you'll try to access to that parameter via dot-notation (my_widget.method).
What did you? In your class you assign instance of SingleSelectField? to method variable. SingleSelectField? is the widget. Every widget is callable object. At call time it returns ElementStream/Element? instance. Also you define method as member widget which already defined as widget's parameter.
At the render time TG's internal code tried to access to your member widget method, which is parameter too, and expected to get Widget-base instance, but got Element instance. Why? Because method is the parameter, it has instance of some widget and as we know - every widget is the callable object.