Pregunta

Pregunta:

¿Cómo pre-rellenar un CheckBoxTable de ToscaWidgets con los valores.

Antecedentes:

He buscado por todas partes y me parece que no puede encontrar la manera de inicializar un campo de forma particular con ToscaWidgets. La mayoría de los campos de formulario parecen responder bien a la inicialización, como si se crea un formulario con un único campo de texto en él cuando me hacen la forma en la plantilla y pase ValorDelCampo = x, donde ValorDelCampo es el nombre del campo de texto y X es un trozo de cuerda la TextField se llenará de x. Mi problema es con toda campo de selección múltiple, en particular, CheckBoxTable. No importa lo que pase en que no se inicializará la selección múltiple. Aquí está un ejemplo de lo que estoy hablando, se trata de una página de usuario de edición con un CheckBoxTable para los grupos para que pueda seleccionar varios o ningún grupo fuera de una lista de varios grupos tomaron de la DATABSE:

Lo que tengo:

Mi widget es:

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

En mi controlador que tengo:

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

y en mi plantilla (Mako) Tengo:

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

Lo que he intentado:

En mi diccionario userAttributs que he probado:

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é consigo:

El resultado de todo de este código es un formulario de edición del usuario con los datos pre-llenados con los datos de usuario, excepto para el CheckBoxTable. El CheckBoxTable tiene todos los grupos en mi base de datos que muestran y vacíos, lo que necesito para que ellos estarán exhibiendo pero que tienen los grupos el usuario es, aparte de comprobar. Pensé que el código en los atributos modelo había de hacer esto, ya que eso es lo que hace para cualquier otro campo, pero debe haber alguna cosa fundamental que me falta acerca de instancias CheckBoxTable.

Especificaciones:

Estoy usando TurboGears 2 con ToscaWidgets 0.9.7 formas y Mako para plantillas.

¿Fue útil?

Solución

ponerlos a través del valor de parámetro.

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>'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top