带有支架的复选框
我一直在尝试在pylons的mako模板中添加一些复选框。但是我不知道怎么在控制器中获取它们的值。似乎只能获取复选框的第一个值。我试过使用表单编码,但遇到了好几个错误。有没有更简单的方法可以做到这一点?
谢谢
1 个回答
0
我假设你说的“我只能获取第一个值”是指你在表单中有一系列复选框,它们的'name'属性值是一样的,对吧?
如果是这样,你想要根据复选框是否被选中来得到一系列布尔值(真或假),你需要做两件事:
首先,当你用表单编码来定义复选框时,要设置成如果复选框没有被选中,就返回'False'。这样的话,浏览器不会发送任何值,除非复选框是“开启”的,而你的验证会把缺失的值当作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'}]}
希望对你有帮助