2011-03-02 59 views
11

POST请求多维数组我有一个是发送具有多维数组POST请求一个jquery客户端,这样的事情:雷丁从在Django

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

即,两个阵列项目,名称和ID。

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

+0

向我们展示jQuery代码。这不是HTTP POST中多值元素的正常格式。 – 2011-03-02 16:09:57

+0

感谢丹尼尔 - 请参阅DrMeers的回答下面,它显示我遇到的问题,但我正在寻找更好的解决方案.. – Liorsion 2011-03-06 07:37:31

回答

5

这与that question有关。如上所述,我为Django/Python制作了特殊的库来处理通过请求发送的多维数组。你可以在GitHub here上找到它。

+0

谢谢伯尼。我最终做了赫尔曼的建议,但我认为这个解决方案更清洁.. – Liorsion 2011-05-14 07:33:37

+0

伟大的图书馆!谢谢! – kronosapiens 2015-05-07 21:51:46

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') 
+1

链接已损坏。请总结这个答案中的信息,或者由于缺乏任何上下文而需要删除。这就是为什么只用一个链接来回答是一个坏主意,他们往往会不时突破。 – 2011-03-31 13:09:31

+0

'这有帮助吗?'不。 – Will 2011-03-31 13:12:35

+0

你走了。谢谢谷歌缓存... – DrMeers 2011-03-31 19:44:01

7

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 
+0

谢谢赫尔曼..不*完全*我需要什么,但足够接近。我认为一个更准确的结果会返回一个字典列表,而不是字典字典,但它或多或少是相同的。再次谢谢你! – Liorsion 2011-04-02 11:18:15

+0

非常简单 - 谢谢! – 2013-05-31 06:55:59

+2

@Liorsion:通过用“return [item for key,item in sorted(dic.items())]”替换最后一行,您将有相应的列表作为返回对象。 – 2013-05-31 07:38:50