问题 从Django中的POST请求中读取多维数组


我有一个jquery客户端发送带有多维数组的POST请求,如下所示:

friends[0][id]    12345678 
friends[0][name]  Mr A
friends[1][id]    78901234
friends[1][name]  Mr B

也就是说,一个包含两个项目的数组,name和id。

是否有自动方式接收此输入作为列表或字典?我似乎无法使.getlist工作


1420
2018-03-02 16:00


起源

向我们展示jQuery代码。这不是HTTP POST中多值元素的正常格式。 - Daniel Roseman
谢谢丹尼尔 - 请看DrMeers的回答,它显示了我遇到的问题,但我正在寻找更好的解决方案.. - Liorsion


答案:


这与此有关 那个问题。如上所述,我为Django / Python创建了特殊的库来处理通过请求发送的多维数组。你可以在GitHub上找到它 这里


5
2018-05-13 18:58



谢谢Berni。我最终做了Herman的建议,但我认为这个解决方案更清洁了.. - Liorsion
好图书馆!谢谢! - kronosapiens


DrMeers的链接不再有效,所以我将发布另一种实现相同功能的方法。它也不完美,如果Django内置了这样的功能会更好。但是,因为它没有:

在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

7
2018-03-31 11:14



谢谢赫尔曼......不是 究竟 我需要什么,但足够接近。我认为更准确的结果会返回一个字典列表而不是字典字典,但它或多或少都是一样的。再次谢谢你! - Liorsion
非常简单 - 谢谢! - Simon Steinberger
@Liorsion:用“return [item for key,item in sorted(dic.items())]”替换最后一行,你将得到相应的列表作为返回对象。 - Simon Steinberger


这有帮助吗? 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')

3
2018-03-03 01:16



链接坏了。请总结此答案中的信息,或者由于缺少任何上下文而需要删除。这就是为什么回答一个链接是一个坏主意,他们往往会不时打破。 - Tim Post♦
Does this help? 不。 - Will
你去吧谢谢Google-cache ... - DrMeers