代码之家  ›  专栏  ›  技术社区  ›  Robbie

使用ToscaWidgets初始化表单

  •  3
  • Robbie  · 技术社区  · 16 年前

    问题:

    如何使用值从ToscaWidgets预填充复选框表。

    背景:

    我到处都找过了,我似乎不知道如何用ToscaWidgets初始化一个特定的表单字段。大多数表单域似乎对初始化的响应都很好,例如,当我在模板中呈现表单并传入fieldvalue=x时,如果创建一个包含单个textfield的表单,其中fieldvalue是textfield的名称,x是一些字符串,textfield将用x填充。我的问题是所有多个select字段,特别是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}
    

    我试过的:

    在我的用户属性字典中,我尝试过:

    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实例化,一定有一些基本的东西我遗漏了。

    规格:

    我使用的是涡轮齿轮2和ToscaWidgets 0.9.7表单以及Mako模板。

    1 回复  |  直到 16 年前
        1
  •  1
  •   Tom Willis    16 年前

    通过值参数设置它们。

    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>'
    
    推荐文章