从 Django 中的 POST 请求中读取多维数组
Posted
技术标签:
【中文标题】从 Django 中的 POST 请求中读取多维数组【英文标题】:Reading multidimensional arrays from a POST request in Django 【发布时间】:2011-07-07 09:44:12 【问题描述】:我有一个 jquery 客户端,它发送一个带有多维数组的 POST 请求,如下所示:
friends[0][id] 12345678 friends[0][name] Mr A friends[1][id] 78901234 friends[1][name] Mr B
即一个包含两个项目的数组,name 和 id。
有没有一种自动的方式来接收这个输入作为列表或字典?我似乎无法使 .getlist 工作
【问题讨论】:
向我们展示 jQuery 代码。这不是 HTTP POST 中多值元素的正常格式。 感谢 Daniel - 请参阅下文 DrMeers 的回答,它显示了我遇到的问题,但我正在寻找更好的解决方案.. 【参考方案1】:DrMeers 的链接不再有效,所以我将发布另一种实现相同目的的方法。它也不完美,如果Django内置这样的功能会更好。但是,因为它没有:
Converting Multi-dimensional Form Arrays in Django
免责声明:我写了那篇文章。它的本质在于这个函数,它可能更健壮,但它适用于一层对象的数组:
def getDictArray(post, name):
dic =
for k in post.keys():
if k.startswith(name):
rest = k[len(name):]
# split the string into different components
parts = [p[:-1] for p in rest.split('[')][1:]
print parts
id = int(parts[0])
# add a new dictionary if it doesn't exist yet
if id not in dic:
dic[id] =
# add the information to the dictionary
dic[id][parts[1]] = post.get(k)
return dic
【讨论】:
感谢 Herman.. 不是 完全 我需要的,但足够接近。我认为更准确的结果将返回字典列表而不是字典字典,但它或多或少是相同的。再次感谢您! @Liorsion:通过将最后一行替换为“return [item for key, item in sorted(dic.items())]”,您将获得相应的列表作为返回对象。【参考方案2】:这与that question 有关。如那里所述,我为 Django/Python 制作了特殊的库来处理通过请求发送的多维数组。你可以在 GitHub here 上找到它。
【讨论】:
谢谢伯尼。我最终按照 Herman 的建议做了,但我认为这个解决方案更清洁.. 很棒的图书馆!谢谢!【参考方案3】:这有帮助吗? http://dfcode.com/blog/2011/1/multi-dimensional-form-arrays-and-django/
如果您想要 POST 数据,获取它的唯一方法是指定您要查找的确切“名称”:
person[1].name = request.POST['person[1][name]'] person[1].age = request.POST['person[1][age]'] person[2].name = request.POST['person[2][name]'] person[2].age = request.POST['person[2][age]']
当您需要提取表单值而无需将全名显式输入为字符串时,这是 Python 中的一种快速即时解决方法:
person_get = lambda *keys: request.POST[ 'person' + ''.join(['[%s]' % key for key in keys])]
现在,当您需要信息时,将这些傻瓜之一投入其中,您将拥有更大的灵活性。快速示例:
person[1].name = person_get('1', 'name') person[1].age = person_get('1', 'age') person[2].name = person_get('2', 'name') person[2].age = person_get('2', 'age')
【讨论】:
链接已损坏。请总结此答案中的信息,否则由于缺少任何上下文而需要删除。这就是为什么只用一个链接来回答是个坏主意,它们往往会不时中断。 @DrMeers 我怎么知道那里有多少人对象?前任。一个提交最多人[2],另一个提交包括最多人[11]以上是关于从 Django 中的 POST 请求中读取多维数组的主要内容,如果未能解决你的问题,请参考以下文章
从 django 中的发布请求中获取数据非表单数据 [关闭]
Django 视图从应该发送 POST 的表单接收 GET 请求