Diez B. Roggisch wrote:
> Here we have the problem. params is a passed dictionary, _not_ a dictionary
> passed via ** as arguments!!!
>
> I'm not exactly sure which magic makes 2) work, but I'm pretty sure my
> solution works if you do it like this:
>
> ${form(params=params)}
>
yes, it's my fault. I was meaning to pass value, params and such
together to the template and the form, and I've fixed it now
So, this test case should work, right?
> myform = wid.TableForm( fields = [
> wid.SingleSelectField('foo',options=[('','')]) ])
>
> @expose(template='erp.templates.test')
> def test(self):
> params = {
> 'foo':{'options':[('baz','baz')]}
> }
>
> return dict(form=self.myform,params=params)
--test.kid--
...
${form(params=params)}
...
SingleSelectField.update_params() is called with
d={....,params={'options':[('baz','baz')]}...,options=[('','')]...}
Of course, the updated options never make it into self.options. There is
nothing like self.__dict__.update(**d['params']), after all.. because we
need to reuse the same widget instance across threads.
I put a breakpoint in Widget.display(), just before returning the
template's ElementTree.Element:
> (Pdb) self
> SingleSelectField(name='foo', convert=False, css_classes=[], attrs={},
> field_class='singleselectfield', options=[('', '')])
> (Pdb) l
> 260 params["value"] = to_unicode(self.adjust_value(value,
> **params))
> 261 self.update_params(params)
> 262 # update_data has been deprecated
> 263 self.update_data(params)
> 264 import pdb; pdb.set_trace()
> 265 -> return view.engines.get('kid').transform(params,
> self.template_c)
> 266
> 267 def render(self, value=None, format="html", **params):
> 268 """
> 269 Exactly the same as display() but return serialized
> output instead.
> 270 Useful for debugging or to display the widget in a
> non-Kid template like
> (Pdb) params
> {'convert': False, 'name': 'foo', 'error': None, 'field_id':
> 'form_foo', 'value': None, 'label': 'Foo', 'params': {'options':
> [('baz', 'baz')]}, 'attrs': {}, 'css_classes': [], 'help_text': None,
> 'field_class': 'singleselectfield', 'options': [('', '', {'selected':
> 'selected'})], 'grouped_options': [(None, [('', '', {'selected':
> 'selected'})])]}
Here, we have
1) params['params']['options'] ... which means... i'm not sure
2) params['options'] is ignored anyway, because the template uses
params['grouped_options'] and completely ignores 'options'. So if there
is any updating of options, it must be done before grouped_options is
constructed
Back to the repeating widget, what does this mean?
Basically, the only way to update the options is pass them outside
params. And if I do that, they are not passed down through the repeating
widget.
uhm.
I guess I will use
> class MySelectField(wid.SingleSelectField):
> def update_params(self, d):
> if d.get('params',{}).get('options'):
> d['options'] = d['params']['options']
> return super(MySelectField, self).update_params(d)
This works. If there is any easier way, I'd be glad to know, otherwise
it should probably be handled by the FAQ or by TG1.1
I can also address specific repetitions
The correct syntax is: params = {'outerwidget':
[{'repeatedwidget':{'options':[...]}...},{'repeatedwidget'....}]}.
Thanks again
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---