Diego Woitasen schrieb:
> On Tue, May 26, 2009 11:49 am, Diez B. Roggisch wrote:
>> On Tuesday 26 May 2009 16:04:09 Diego Woitasen wrote:
>>> On Tue, May 26, 2009 6:50 am, Diez B. Roggisch wrote:
>>>> On Tuesday 26 May 2009 03:28:14 Diego Woitasen wrote:
>>>>> Hi,
>>>>>  I want to write a reusable form using TableForm as base class. I
>>> tried
>>>>> with this:
>>>>>
>>>>> class RuleForm(TableForm):
>>>>>   def __init__(self, id=None, parent=None, children=[],
>>> host_filter=[],
>>>>> **kw):
>>>>>     super(RuleForm, self).__init__(id,parent,children, **kw)
> self.fields = [
>>>>>         TextField(id = 'description', label = 'Description'),
>>>>>     ]
>>>>>
>>>>> and this:
>>>>>
>>>>> class RuleForm(TableForm):
>>>>>   def __init__(self, id=None, parent=None, children=[],
>>> host_filter=[],
>>>>> **kw):
>>>>>     children = [
>>>>>         TextField(id = 'description', label = 'Description'),
>>>>>     ]
>>>>>     super(RuleForm, self).__init__(id,parent,children, **kw)
>>>>>
>>>>> without sucess.
>>>> What does "without success" mean? You are aware, that in the latter
> example
>>>> you simply override whatever children are passed?
>>>>
>>>> Besides, the simple problem of yours seems to be solvable using
>>>>
>>>>
>>>> common_widgets = [...] # list of widgets
>>>>
>>>> some_form = Form(children = common_widgets + some_other_widgets]
>>>>
>>>> Diez
>>> Means, it doesn't work. If I use fields outside the constructor works, for
>>> example:
>>> class RuleForm(TableForm):
>>>   fields = [
>>>     TextField(id = 'description', label = 'Description'),
>>>   ]
>>>   def __init__(self, id=None, parent=None, children=[], host_filter=[],
>>> **kw):
>>>     super(RuleForm, self).__init__(id,parent,children, **kw)
>>> That works, but I need fields inside the constructor because I want to use
>>> SelectionList or CheckboxList which contents could change in each use
> of
>>> RuleForm (quering data from database).
>> This is not intended to work. ToscaWidgets are instantiated once, and
> re-used.
>> To make selectfields display varying values, use a callable as
>> options-parameter.
>>
>> def get_options():
>>       return some_options
>>
>>
>> class MyForm(TableForm):
>>        class fields(WidgetList):
>>                select_field = SingleSelectField(options=get_options)
>>
>>
>> Diez
>>
> 
> I got "TypeError: 'function' object is not iterable".

Full stacktrace please, and code.... crystal-ball time is over for this 
month.

This works in our codebase, so the problem must be on your side:

def get_users():
     """
     This function returns a list of tuples

      (User, str)

     to be used as options for a SingleSelectField.

     It is important to work with **User**-objects here,
     **not** with ids! Otherwise in case of a failed
     validation, the display of the SingleSelectField
     wouldn't show the last selected value.
     """
     return [(u, u.email) for u in User.query()[:10]]


model_select_form = ListForm("model_select_form",
                              action="model_select_field_action",
                              fields=[SingleSelectField("user",
                                                        options=get_users,
 
validator=ModelValidator(User)),
                                      TextField("leave_me_empty", 
validator=NotEmpty()),
                                      ])





> Anyway, I don't like that approach. What if a want to pass parameters to
> get_options()? I want to pass a SQLAlchemy query when the form is
> instantiated to condition the data to be returned i select fields.
> 
> I think the solution at the moment is to write a function that return all
> childrens to pass to my form but I don't like it.

There are various ways to overcome this. You can use the tmpl_context to 
pass the query.


def get_options():
     return tmpl_context.some_options


# in the controller

@expose()
def my_action(self, ...):
     tmlp_context.some_options = my_query
     return ...


It should also be possible to do something like this (in the template):

${my_form.display(value, dict(options=dict(select_field=the_query)))}


Diez

--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to