我有HTML表单输入字段,该字段返回一个字典列表,我希望通过在Django View中使用PYthon获取值。
表格返回:
request.POST['tags'] returns => [{"value":"summer"},{"value":"winter"}]
当我尝试使用[tag['value'] for tag in request.POST['tags']]
遍历获取值时,我得到了TypeError: string indices must be integers
。
但是,如果我手动将输入字段的结果复制到命令行并逐行进行,则它会按预期工作:
>>> test = [{"value":"summer"},{"value":"winter"}]
>>> test
>>> [{'value':'summer'},{'value':'winter'}]
>>> [tag['value'] for tag in test]
>>> ['summer', 'winter']
发生了什么事?
已更新,添加了3个不同请求的打印。POST结果:
request.POST => <QueryDict: {'tags': ['[{"value":"summer"},{"value":"winter"}]']}>
request.POST.values => <bound method MultiValueDict.values of <QueryDict: {
'tags': ['[{"value":"summer"},{"value":"winter"}]']}>>
request.POST[tags] => [{"value":"summer"},{"value":"winter"}]
答案 0 :(得分:0)
https://docs.djangoproject.com/en/2.2/ref/request-response/#querydict-objects
QueryDict.__getitem__(key)
返回给定键的值。如果键有多个值,则返回最后一个值。如果键不存在,则引发django.utils.datastructures.MultiValueDictKeyError。 (这是Python标准KeyError的子类,因此您可以继续捕捉KeyError。)
当同一键具有多个值时,您将不得不使用getlist()
:
[tag['value'] for tag in request.POST.getlist('tags')]
https://docs.djangoproject.com/en/2.2/ref/request-response/#django.http.QueryDict.getlist
QueryDict.getlist(key, default=None)
使用请求的键返回数据列表。如果该键不存在且未提供默认值,则返回一个空列表。除非提供的默认值不是列表,否则保证返回列表。
编辑
好的,我现在可以看到问题。您不是要向arg tags
发送列表,而是要发送表示列表的字符串。
如果我什么都不缺,那么应该可以进行以下操作:
import json
tags = json.loads(request.POST['tags'])
[tag.get('value') for tag in tags]