Pylons/Formencode与多个复选框

0 投票
2 回答
1327 浏览
提问于 2025-04-15 15:03

今天我在使用Pylons/Formencode的时候遇到了一些问题,主要是关于验证多个复选框的。先给你点背景知识,我在我的Mako模板里有这样的代码:

<input type="checkbox" name="Project" value="1">Project 1</input>
<input type="checkbox" name="Project" value="2">Project 2</input>
<input type="checkbox" name="Project" value="3">Project 3</input>
<input type="checkbox" name="Project" value="4">Project 4</input>
<input type="checkbox" name="Project" value="5">Project 5</input>

在我的验证规则里,我写了类似这样的东西(请原谅我可能的错误,因为我手边没有确切的代码):

Project = formencode.foreach.ForEach(formencode.validators.Int())

我本来期待能得到一个包含所有选中项的列表(听起来很合理,对吧?)但实际上我只得到了一个包含单个项目的列表,尽管我所有的复选框都是选中的。我是在做错什么,还是说我想要的结果根本就不可能实现?为了绕过这个问题,我写了一个小技巧,为每个复选框添加了onclick事件,这样每当选中一个复选框,就会把选中的项添加到一个数组里,然后以JSON格式提交回去——这实在是太麻烦了,因为如果验证失败,我还得自己重新填充所有字段。

有没有人有什么好主意?

2 个回答

-1

redrockettt,

你有没有看过variabledecode这个函数的文档说明?里面建议你可以使用类似下面的代码:

<input type="checkbox" name="Project-1" value="1">Project 1</input>
<input type="checkbox" name="Project-2" value="2">Project 2</input>
<input type="checkbox" name="Project-3" value="3">Project 3</input>

你可以查看variabledecode.py文件里的内容,或者在这里粘贴的内容。

2

也许可以使用 formencode.validators.Set 这个工具:

>>> Set.to_python(None)
[]
>>> Set.to_python('this')
['this']
>>> Set.to_python(('this', 'that'))
['this', 'that']
>>> s = Set(use_set=True)
>>> s.to_python(None)
set([])
>>> s.to_python('this')
set(['this'])
>>> s.to_python(('this',))
set(['this'])

撰写回答