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