Инициализация формы с помощью ToscaWidgets
-
21-08-2019 - |
Вопрос
Вопрос:
Как мне предварительно заполнить CheckBoxTable из ToscaWidgets значениями.
Фон:
Я везде искал и не могу понять, как инициализировать определенное поле формы с помощью ToscaWidgets.Большинство полей формы, кажется, прекрасно реагируют на инициализацию, например, если я создаю форму с одним TextField в ней, когда я отображаю форму в шаблоне и передаю fieldValue=x, где fieldValue — это имя TextField, а x — некоторая строка TextField будет заполнен x.Моя проблема связана со всеми полями множественного выбора, в частности с 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')
и в моем шаблоне (Мако) у меня есть:
${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
Что я получаю:
Результатом всего этого кода является форма редактирования пользователя с данными, предварительно заполненными данными пользователя, за исключением CheckBoxTable.В CheckBoxTable все группы в моей базе данных отображаются и пусты, что мне нужно, чтобы они отображались, но отмечены группы, от которых пользователь не зависит.Я думал, что код в атрибутах модели сделает это, поскольку он делает то же самое для любого другого поля, но, должно быть, есть какая-то фундаментальная вещь, которую мне не хватает при создании экземпляра CheckBoxTable.
Характеристики:
Я использую Turbogears 2 с формами ToscaWidgets 0.9.7 и Mako для создания шаблонов.
Решение
установите их через параметр значения.
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>'