Domanda

Domanda:

Come faccio a precompilare un CheckBoxTable da ToscaWidgets con i valori.

Sfondo:

ho cercato ovunque e io non riesco a capire come inizializzare un particolare campo di modulo con ToscaWidgets. La maggior parte dei campi del modulo sembrano rispondere bene alle inizializzazione, come se creo un modulo con una sola TextField in esso quando io rendo il modulo nel modello e passare fieldValue = x dove fieldValue è il nome del TextField e X è una stringa TextField sarà riempito con x. Il mio problema è con tutti i campi di selezione multipla, in particolare CheckBoxTable. Non importa quello che mi passa in esso non verrà inizializzato il multiplo di selezione. Ecco un esempio di cosa sto parlando, si tratta di una pagina di modifica utente con un CheckBoxTable per i gruppi in modo da poter selezionare più o gruppi su un elenco di diversi gruppi recuperati dal databse:

Quello che ho:

Il mio widget è:

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

Nel mio regolatore ho:

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

e nel mio modello (Mako) ho:

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

Quello che ho provato:

Nel mio dizionario userAttributs ho provato:

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

Cosa ottengo:

Il risultato di tutto questo codice è un modulo di modifica per l'utente con i dati pre-riempite con i dati utente ad eccezione del CheckBoxTable. Il CheckBoxTable ha tutti i gruppi nel mio database visualizzazione e vuoti, che cosa ho bisogno per loro di essere mostrando, ma hanno i gruppi l'utente è parte della controllata. Ho pensato che il codice nei attributi modello avrebbe fatto questo, dal momento che è quello che fa per ogni altro campo, ma ci deve essere una cosa fondamentale che mi manca circa istanziazione CheckBoxTable.

Spec:

Sto usando TurboGears 2 con ToscaWidgets 0.9.7 forme e Mako per modellare.

È stato utile?

Soluzione

impostarle tramite il parametro di valore.

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>'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top