在Tornado中POST多个复选框值
我正在玩一个用Tornado框架做的网页应用,需要一点帮助。我有多个名字相同的复选框,想要把选中的值通过POST请求发送出去。
<input id=DB_BASED_ID name="activity" value=DB_BASED_ID type="checkbox"/>
<input id=DB_BASED_ID name="activity" value=DB_BASED_ID type="checkbox"/>
<input id=DB_BASED_ID name="activity" value=DB_BASED_ID type="checkbox"/>
<input id=DB_BASED_ID name="activity" value=DB_BASED_ID type="checkbox"/>
我可以在发送请求之前用JavaScript获取每个复选框的值,但在Python(Tornado)这边遇到了问题,只能得到选中的最高值。
在Python这边的代码看起来是这样的:
...
def post(self):
email = self.get_argument("email")
activity = self.get_argument("activity")
2 个回答
0
这也可以通过循环来实现动态展示和收集。假设你在GET方法中提供了一个要检查的列表,它可以在HTML中这样显示:
<p><h3>Select Applicable Characteristics:</h3></p>
{% for c in chars %}
<p><h4><input type="checkbox" name="{{ c }}" value="{{ c }}"/> {{ c }}</h4></p>
{% end %}
POST方法可以遍历这个列表,为每一项收集数据并创建一个列表输入。虽然这稍微复杂一点,但我之前提到的解决方案我没能成功实现。
# Characteristics loop
chars = [x.split('_')[1] for x in bs.attr.keys('chr_*')]
checked_chars = []
for c in chars:
checked = self.get_argument(c, None)
if checked is not None:
checked_chars.append(checked)
这结合了Tornado的模板功能(jinja2)和一些HTML,形成了一个简单的界面。虽然可行且快速,但坦白说,这并不是最好的生产解决方案。希望这对你有帮助!
2
多个标签可以有相同的 name 属性,这没问题,但 id
属性 必须 是唯一的——在这里,它们并不是唯一的(除非这些相同的 DB_BASED_ID
是想要被替换成 不同 的值?但那样的话,为什么不直接显示这些在真实 HTML 中 确实 不同的东西呢?),这就导致了无效的 HTML,可能会引发各种问题。
一旦这个问题解决了,在那些处理方法中,self.request.arguments['activity']
(如果这个字符串键在目录中存在的话)将会是一个包含所有名为 'activity'
的输入的非空值的列表(如果有的话)。