Question

Question:

Comment puis-je un pré-remplir CheckBoxTable de ToscaWidgets avec des valeurs.

Contexte:

Je l'ai regardé semblent partout et je ne peux pas à comprendre comment initialiser un champ de formulaire particulier ToscaWidgets. La plupart des champs de formulaire semblent répondre très bien à l'initialisation, comme si je crée une forme avec un seul TextField quand je rends la forme dans le modèle et passer fieldValue = x où fieldValue est le nom du TextField et x est une chaîne de caractères le TextField sera rempli de x. Mon problème est avec tous les multiples champs de sélection, en particulier CheckBoxTable. Peu importe ce que je passe il ne sera pas initialiser le multiple select. Voici un exemple de ce dont je parle, il est une page d'édition de l'utilisateur avec un CheckBoxTable pour les groupes afin que vous pouvez sélectionner plusieurs ou aucun groupe sur une liste de plusieurs groupes extraits de la databse:

Ce que je:

Mon widget est:

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")

Dans mon contrôleur je:

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')

et dans mon modèle (Mako) je:

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

Ce que j'ai essayé:

J'ai essayé dans mon dictionnaire 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

Qu'est-ce que je reçois:

Le résultat de tout ce code est une forme d'édition de l'utilisateur avec des données pré-remplies avec les données de l'utilisateur, à l'exception de la CheckBoxTable. Le CheckBoxTable a tous les groupes dans ma base de données et l'affichage vides, ce que je besoin pour qu'ils soient, mais ont les affichent groupes auxquels l'utilisateur est en dehors de la vérification. Je pensais que le code dans les attributs du modèle serait cela, puisque c'est ce qu'il fait pour tous les autres domaines, mais il doit y avoir quelque chose de fondamental qui me manque sur les CheckBoxTable instanciation.

Caractéristiques:

J'utilise Turbogears 2 avec ToscaWidgets 0.9.7 formes et Mako pour templating.

Était-ce utile?

La solution

les définir par la valeur 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>'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top