【问题标题】:Reading multidimensional arrays from a POST request in Django从 Django 中的 POST 请求中读取多维数组
【发布时间】: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 的回答,它显示了我遇到的问题,但我正在寻找更好的解决方案..

标签: jquery django post


【解决方案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]
猜你喜欢
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
  • 2020-05-19
  • 2015-12-18
  • 1970-01-01
相关资源
最近更新 更多