如何最好地将数据库对象传递给turbogears WidgetList?

时间:2009-02-05 11:35:01

标签: python turbogears

我正在尝试设置表单小部件,以便将一些对象添加到数据库中,但是我被卡住了,因为似乎无法将任何参数传递给WidgetList中包含的Widgets。为了澄清这一点,这是我的WidgetList:

class ClientFields(forms.WidgetsList):
    """Form to create a client"""

    name = forms.TextField(validator=validators.NotEmpty())
    abbreviated = forms.TextField(validator=validators.NotEmpty(), attrs={'size':2})
    address = forms.TextArea(validator=validators.NotEmpty())
    country = forms.TextField(validator=validators.NotEmpty())
    vat_number = forms.TextField(validator=validators.NotEmpty())
    email_address = forms.TextField(validator=validators.Email(not_empty=True))
    client_group = forms.SingleSelectField(validator=validators.NotEmpty(),
                                       options=[(g.id, g.name) for g in ClientGroup.all_client_groups().all()])

你看我不得不求助于从WidgetList中抓取数据库中的对象,这意味着它与数据库代码紧密耦合(即使它在模型中使用了类方法)。

问题在于,一旦创建了WidgetList实例,就无法访​​问这些字段(否则我只能从控制器调用client_fields.client_group.options = [(key,value)] - 这些字段将从该类并添加到列表中,所以要再次找到它们,我必须遍历该列表以找到我想要改变的Field类 - 不干净。这是ipython的输出,因为我查看了WidgetsList:

In [8]: mad.declared_widgets
Out[8]: 
[TextField(name='name', attrs={}, field_class='textfield', css_classes=[], convert=True),
 TextField(name='abbreveated', attrs={'size': 2}, field_class='textfield', css_classes=[], convert=True),
 TextArea(name='address', rows=7, cols=50, attrs={}, field_class='textarea', css_classes=[], convert=True),
 TextField(name='country', attrs={}, field_class='textfield', css_classes=[], convert=True),
 TextField(name='vat_number', attrs={}, field_class='textfield', css_classes=[], convert=True),
 TextField(name='email_address', attrs={}, field_class='textfield', css_classes=[], convert=True),
 SingleSelectField(name='client_group', attrs={}, options=[(1, u"Proporta's Clients")], field_class='singleselectfield', css_classes=[], convert=False)]

那么......设置这些Widgets和WidgetLists的正确方法是什么,而不将它们与数据库紧密耦合等等?

1 个答案:

答案 0 :(得分:-1)

page in the TurboGears documentation可能会有所帮助。