2009-07-01 6 views
3

Вопрос:Форма Initialization с ToscaWidgets

Как CheckBoxTable с предварительного заполнения от ToscaWidgets со значениями.

фона:

Я посмотрел везде, и я не могу показаться, чтобы выяснить, как инициализировать конкретный вид поля с ToscaWidgets. Большинство полей формы, кажется, отлично реагируют на инициализацию, например, если я создаю форму с одним TextField в ней, когда я визуализую форму в шаблоне и передаю в fieldValue = x, где fieldValue - это имя TextField, а x - некоторая строка TextField будет заполнен х. Моя проблема связана со всем полем множественного выбора, в частности с CheckBoxTable. Независимо от того, что я передаю, он не будет инициализировать множественный выбор. Вот пример того, о чем я говорю, это страница редактирования пользователя с CheckBoxTable для групп, поэтому вы можете выбрать несколько групп или не из списка из нескольких групп, извлеченных из базы данных:

Что я имею :

Мой виджет:

from tw import forms 
class UserForm(forms.TableForm): 

    show_errors = True 
    submit_text = "Create User" 

    clientOptions = [(-1, "Select a Client")] 
    groupOptions = [(-1, "Select a Group")] 

    fields = [forms.TextField('name', label_text='User Name', validator=String(not_empty=True), size=40), 
       forms.Spacer(), 
       forms.SingleSelectField('clientID', label_text='Client Name', validator=Int(min=0), options=clientOptions), 
       forms.Spacer(), 
       forms.CheckBoxTable('groups', lable_text='Groups', validator=Set(), options=groupOptions, num_cols=3), 
       forms.Spacer(), 
       forms.PasswordField('password', label_text="Password", validator=String(not_empty=True, min=6), size=40), 
       forms.PasswordField('passwordAgain', label_text="Repeat Password", validator=String(not_empty=True, min=6), size=40), 
       forms.HiddenField('id')] 

editUserForm = UserForm("createUserForm", action='alterUser', submit_text="Edit User") 

в мой контроллер у меня есть:

result = model.DBSession.query(model.User).filter_by(id=kw['id']).first() 
tmpl_context.form = editUserForm 
clientOptions=model.DBSession.query(model.Client.id, model.Client.name) 
groupOptions=model.DBSession.query(model.Group.id, model.Group.name) 
formChildArgs = dict(clientID=dict(options=clientOptions), groups=dict(options=groupOptions)) 

userAttributes=dict(id=result.id, name=result.name, groups=[g.id for g in result.groups], clientID=result.clientID, password=result.password, passwordAgain=result.password) 

return dict(verb="Edit", modelName = "User", modelAttributes=userAttributes, formChildArgs=formChildArgs, page='editUser') 

и в моем templat е (Mako) У меня есть:

${tmpl_context.form(modelAttributes, child_args=formChildArgs) | n} 

Что я пробовал:

В моих userAttributs СЛОВАРЬ Я пробовал:

groups=[g.id for g in result.groups] 
groups=[g.name for g in result.groups] 
groups=[(g.id, g.name) for g in result.groups] 
groups=[[g.id, g.name) for g in result.groups] 
groups=result.groups 

Что я получаю:

Результатом всего этого кода является форма редактирования пользователя с данными, предварительно заполненными данными пользователя, за исключением CheckBox Таблица. В CheckBoxTable есть все группы в моей базе данных, отображающие и пустые, что мне нужно для их отображения, но есть группы, в которых пользователь находится вне проверки. Я думал, что код в атрибутах модели будет делать это, так как это то, что он делает для каждого другого поля, но должна быть какая-то фундаментальная вещь, которую мне не хватает в создании экземпляра CheckBoxTable.

Характеристика:

Я использую Turbogears 2 с ToscaWidgets 0.9.7 формы и Mako для шаблонов.

ответ

1

установить их через параметр param.

import tw.forms 
f = tw.forms.TableForm(fields=[tw.forms.CheckBoxTable("name",options=(("foo"),("bar")))]) 
f(value={"name":{"foo":True,"bar":False}}) 
>>> u'<form xmlns="http://www.w3.org/1999/xhtml" action="" method="post" class="tableform">\n <table border="0" cellspacing="0" cellpadding="2">\n<tr id="name.container" class="even" title="">\n   <td class="labelcol">\n    <label id="name.label" for="name" class="fieldlabel">Name</label>\n   </td>\n   <td class="fieldcol">\n    <table id="name" class="checkboxtable">\n <tbody>\n <tr>\n  <td>\n 
    <input id="name_0" value="foo" name="name" type="checkbox" checked="checked" />\n   <label for="name_0">foo</label>\n  </td>\n </tr><tr>\n  <td>\n   <input id="name_1" value="bar" name="name" type="checkbox" />\n   <label for="name_1">bar</label>\n  </td>\n </tr>\n 
</tbody>\n</table>\n   </td>\n  </tr><tr id="submit.container" class="odd" title="">\n   <td class="labelcol">\n   </td>\n 
     <td class="fieldcol">\n    <input type="submit" class="submitbutton" value="Submit" />\n   </td>\n  </tr>\n </table>\n</form>' 
+0

Ну, я уже делаю это вручную в контроллере. Моя проблема заключается не в том, что параметры не отображаются. В приведенном выше коде я получаю таблицу флажков со всеми группами, которые я определил в своей базе данных, я просто не могу получить те, которые установлены для этого пользователя, которые будут проверяться. Если, конечно, вы не считаете, что, поскольку моя форма полностью управляется данными, она также решит мою проблему с инициализацией. – Robbie

+0

OH извините, я неправильно понял вопрос. Обычно вы передаете значения полей в параметре значения. Я отредактирую свой ответ за минуту –

+0

Я люблю тебя <3 _______ Итак, я попробовал то, что вы сказали, и это не сработало вечно.Но я медленно начал удалять вещи из своей формы и выяснил, что установка моего валидатора для этого входа в Set() нарушает его. Я, вероятно, позволю ребятам из Тоски узнать об этом и, может быть, они смогут разобраться с WTF. В любом случае, спасибо. – Robbie