Как лучше всего передавать объекты базы данных в турбонагнетатель WidgetList? - PullRequest
1 голос
/ 05 февраля 2009

Я пытаюсь настроить виджеты форм для добавления некоторых объектов в базу данных, но я застреваю, потому что кажется невозможным передать какие-либо аргументы виджетам, содержащимся в 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)]

Итак ... каков был бы правильный способ настроить эти виджеты и списки виджетов, не связывая их слишком тесно с базой данных и т. Д.?

1 Ответ

0 голосов
/ 05 февраля 2009
...