Django相当于PHP的表单值数组/关联数组

Imr*_*ran 45 python forms django

在PHP中,我会这样做以获得name数组.

<input type"text" name="name[]" />
<input type"text" name="name[]" />
Run Code Online (Sandbox Code Playgroud)

或者,如果我想name作为关联数组:

<input type"text" name="name[first]" />
<input type"text" name="name[last]" />
Run Code Online (Sandbox Code Playgroud)

什么是Django相当于这样的东西?

Pao*_*ino 63

查看QueryDict文档,特别是使用QueryDict.getlist(key).

由于视图中的request.POST和request.GET是QueryDict的实例,因此您可以这样做:

<form action='/my/path/' method='POST'>
<input type='text' name='hi' value='heya1'>
<input type='text' name='hi' value='heya2'>
<input type='submit' value='Go'>
</form>
Run Code Online (Sandbox Code Playgroud)

然后这样的事情:

def mypath(request):
    if request.method == 'POST':
        greetings = request.POST.getlist('hi') # will be ['heya1','heya2']
Run Code Online (Sandbox Code Playgroud)

  • 当密钥很重要时,这会失败.例如name ="question [4]",其中4是问题id. (22认同)

gzy*_*gzy 18

很抱歉挖掘它,但Django有一个utils.datastructures.DotExpandedDict.这是一篇文档:

>>> d = DotExpandedDict({'person.1.firstname': ['Simon'], \
        'person.1.lastname': ['Willison'], \
        'person.2.firstname': ['Adrian'], \
        'person.2.lastname': ['Holovaty']})
>>> d
{'person': {'1': {'lastname': ['Willison'], 'firstname': ['Simon']}, '2': {'lastname': ['Holovaty'], 'firstname': ['Adrian']}}}
Run Code Online (Sandbox Code Playgroud)

唯一的区别是你使用点而不是括号.

编辑:此机制被表单前缀替换,但如果您仍想使用此概念,可以在应用程序中删除旧代码:https: //gist.github.com/grzes/73142ed99dc8ad6ac4fc9fb9f4e87d60

  • 自django 1.5以来,DotExpandedDict被删除 (4认同)
  • 我在Django应用程序中依赖DotExpandedDict,它比QueryDict.getlist更有用.不幸的是,它已从Django(至少是开发版本)中删除.你仍然可以[获取它的源代码](https://github.com/django/django/commit/c57abd3c29cedcca00821d2a0d5708f10977f3c6#django/utils/datastructures.py). (2认同)

Gra*_*ant 5

Django没有提供从请求对象获取关联数组(Python中的字典)的方法.正如第一个答案指出的那样,您可以.getlist()根据需要使用,或者编写一个可以QueryDict根据您的喜好进行重新组织的函数(key[*]例如,如果键匹配某些模式,则拉出键/值对).