在Tornado中POST多个复选框值

1 投票
2 回答
4937 浏览
提问于 2025-04-16 03:42

我正在玩一个用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' 的输入的非空值的列表(如果有的话)。

撰写回答