Now I want to have a master/detail form (using tw.dynforms) where each
line has a field which needs to load options from the DB.
eg, in controller:
class LineForm(dynforms.GrowingTableFieldSet):
class children(core.WidgetsList):
amount = forms.TextField(validator=forms.validators.Number)
etype = forms.SingleSelectField()
class EntryForm(dynforms.CustomisedForm, forms.TableForm):
action = 'save_entry'
class children(core.WidgetsList):
date = forms.CalendarDatePicker()
description = forms.TextField()
elines = LineForm()
etype = forms.SingleSelectField()
I successfully pass options to the etype selector in my EntryForm
instance from the template:
${entryform(child_args=dict(etype=dict(options=topts)))}
but I can't find how to pass the same options to the etype selector in
the LineForm instance...
Can anyone point me in the right direction?
Cheers,
Alex
You need to pass child_args to the elines that contain child_args
themselves.
I'm not 100% sure because of the GrowingTableFieldSet, but it's either
directly a dict, or a list with a dict with one entry per row.
So either this
entryform.display(child_args=dict(...,
elines=dict(child_args=dict(etype=dict(...)))
)
or this:
entryform.display(child_args=dict(...,
elines=[dict(child_args=dict(etype=dict(...)), ...])
)
I presume the latter.
Diez
I had a look myself - and also have to admit being defeated. tw.dynforms
uses a rather complex widget-substructure that makes reaching down to
the actual children complicated, and I failed as well.
I will see if I can somehow make that easier.
Diez
Unfortunately no, not so far. And I'm not sure if your use-case can be
tackled by this anyway.
The reason is that the growing table stuff works by creating a hidden
"template node", which is the one which determines for example the
options in a select-field.
Now adding rows will clone this node - and that of course always with
the default options.
Now if I understand you correctly, you want to have individual options,
per row - most probably based by some other field's value.
To make this work for all fields, you'd have to use Javascript then anyway.
Diez