如何最好地将数据库对象传递给涡轮增压器WidgetList?

问题描述:

我想设置窗体小部件来添加一些对象到数据库,但我陷入困境,因为它似乎不可能将任何参数传递给包含在WidgetList中的Widgets。要澄清的是,这里是我的widgetList:如何最好地将数据库对象传递给涡轮增压器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)]

所以......这将是设置这些Widget和WidgetLists以正确的方式,而不会耦合它们得太紧到数据库等等?

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

+0

此代码基于该页面中的所有代码,是的。但它根本没有任何DB代码 - 即字段都是静态的。在那里没有SingleSelectFields ... – 2009-02-05 13:12:10