質問:
ToscaWidgets から CheckBoxTable に値を事前入力するにはどうすればよいですか。
バックグラウンド:
どこを見ても、特定のフォーム フィールドを ToscaWidgets で初期化する方法がわかりません。テンプレートでフォームをレンダリングし、fieldValue=x を渡すときに単一の TextField を含むフォームを作成した場合など、ほとんどのフォーム フィールドは初期化に問題なく応答するようです。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')
そして私のテンプレート(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
私が得るもの:
このすべてのコードの結果は、CheckBoxTable を除くユーザー データが事前に入力されたデータを持つユーザー編集フォームです。CheckBoxTable には、データベース内のすべてのグループが表示されており、空になっています。それらを表示するために必要なものですが、ユーザーがチェックされていないグループを持っています。他のすべてのフィールドに対して行うことなので、モデル属性のコードがこれを行うと思いましたが、CheckBoxTable のインスタンス化について欠けている基本的なことがいくつかあるに違いありません。
仕様:
ToscaWidgets 0.9.7 フォームと Mako を使用して Turbogears 2 をテンプレートとして使用しています。