带挂架的复选框

时间:2010-03-16 18:11:16

标签: python pylons

我一直在尝试在pylons mako中添加一些复选框。但是我不知道如何在控制器中获取它们的值。它似乎只能获得复选框的第一个值。我尝试使用表单编码,但我有几个错误。有更简单的方法吗?

由于

1 个答案:

答案 0 :(得分:0)

我假设“我只能得到第一个值”意味着你的表单中的'name'属性有一系列具有相同值的复选框?

现在,如果是这种情况,并且您想根据是否选中这些框来获取布尔值列表,那么您需要做两件事:

首先,当您在复选框上使用表单编码定义表单元素时,将其设置为使复选框元素上的缺失值返回“False”。这样,由于浏览器不会发送值,除非复选框为“on”,否则验证会将缺失值强制转换为False。


    class Registration(formencode.Schema):  
        box = formencode.validators.StringBoolean(if_missing=False)

接下来,假设您想要返回一个列表,您将无法将所有元素命名为相同。但是,Pylons支持嵌套结构。看看formencode.variabledecode.NestedVariables。简而言之,您需要将NestedVariables实例定义为您的类属性之一,并且您需要更改表单'name'属性以包含显式索引。

编辑..这是我做得很快的完整例子:


import logging
import pprint

import formencode
from pylons import request, response, session, tmpl_context as c, url
from pylons.controllers.util import abort, redirect
from pylons.decorators import validate

from testproj.lib.base import BaseController, render

log = logging.getLogger(__name__)

class CheckList(formencode.Schema):
    box = formencode.validators.StringBoolean(if_missing=False)
    hidden = formencode.validators.String()

class EnclosingForm(formencode.Schema):
    pre_validators = [formencode.NestedVariables()]
    boxes = formencode.ForEach(CheckList())

class MyformController(BaseController):

    def index(self):
        schema = EnclosingForm()
        v = schema.to_python(dict(request.params))
        # Return a rendered template
        #return render('/myform.mako')
        # or, return a response
        response.content_type = 'text/plain'
        return pprint.pformat(v)


然后查询字符串?

boxes-0.box=true&boxes-0.hidden=hidden&boxes-1.box=true&
boxes-1.hidden=hidden&boxes-2.hidden=hidden

最后,回应:

{'boxes': [{'box': True, 'hidden': u'hidden'},
           {'box': True, 'hidden': u'hidden'},
           {'box': False, 'hidden': u'hidden'}]}

HTH