データベースにいくつかのオブジェクトを追加するためのフォーム ウィジェットをセットアップしようとしていますが、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 内からデータベースからオブジェクトを取得する必要があったことがわかります。これは、(モデルで classmethod を使用しているにもかかわらず) データベース コードとかなり緊密に結合していることを意味します。
問題は、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)]
では、これらの Widgets と WidgetLists をデータベースなどに密接に結び付けずに設定するにはどうすればよいでしょうか?