我正在尝试设置表单小部件以将一些对象添加到数据库中,但我遇到了困难,因为似乎无法将任何参数传递给 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 类 - 不干净。这是我查看 WidgetsList 时 ipython 的输出:
在 [8] 中:mad.declared_widgets 输出[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 和 WidgetList 的正确方法是什么?