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

时间:2009-04-29 08:04:11

标签: python django forms html-form

在PHP中,我会这样做以name为数组。

<input type"text" name="name[]" />
<input type"text" name="name[]" />

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

<input type"text" name="name[first]" />
<input type"text" name="name[last]" />

这类东西的Django等价物是什么?

3 个答案:

答案 0 :(得分:62)

Check out the QueryDict documentation,尤其是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>

然后是这样的:

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

答案 1 :(得分: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']}}}

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

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

答案 2 :(得分:5)

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