与this answer类似,我有一个嵌套的数组结构,通过表单提交给Flask
但是,我的值有时可能来自多选下拉列表(几个值),有时则不是,因此我可能需要使用getlist进一步解析它们,但并不总是如此
下面是request.form
的一个示例:
ImmutableMultiDict([('name', 'sadfsdaf'), ('description', ''), ('step_action[0]', 'forward'), ('step_values[0]', 'North America'), ('step_values[0]', 'South America')])
注意step_values[0]
有两个值
通常,您可以通过以下方式访问这些元素:
request.form.getlist('step_values[0]')
我找到了一个helper method来将发布的数据解析为嵌套的数组结构,但是如果有多个值,它不支持调用getlist
助手方法:
def parse_multi_form(form):
"""Returns a dictionary containing complex (multi-dimensional) form data."""
"""https://stackoverflow.com/a/49819417/12718345"""
data = {}
for url_k in form:
v = form[url_k]
ks = []
while url_k:
if '[' in url_k:
k, r = url_k.split('[', 1)
ks.append(k)
if r[0] == ']':
ks.append('')
url_k = r.replace(']', '', 1)
else:
ks.append(url_k)
break
sub_data = data
for i, k in enumerate(ks):
if k.isdigit():
k = int(k)
if i + 1 < len(ks):
if not isinstance(sub_data, dict):
break
if k in sub_data:
sub_data = sub_data[k]
else:
sub_data[k] = {}
sub_data = sub_data[k]
else:
if isinstance(sub_data, dict):
sub_data[k] = v
return data
输出:
{
'name': 'sadfsdaf',
'description': '',
'step_action': {
0: 'forward'
},
'step_values': {
0: 'North America'
}
}
如何修改输出以支持单个键下的多个值,如下图所示
{
'name': 'sadfsdaf',
'description': '',
'step_action': {
0: 'forward'
},
'step_values': {
0: ['North America', 'South America']
}
}
注意在上面的'step_values'[0]
下添加了South America
目前没有回答
相关问题 更多 >
编程相关推荐