从 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 请求

从 PHP 中的 JSON POST 读取 HTTP 请求正文的问题

Django Rest 框架中的发布请求处理

我用django接收post请求结果为空

如何使用 JavaScript 读取 post 请求参数