带有支架的复选框

1 投票
1 回答
1328 浏览
提问于 2025-04-15 20:29

我一直在尝试在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'}]}

希望对你有帮助

撰写回答