Django中PHP表单值数组的等效实现

46 投票
3 回答
14451 浏览
提问于 2025-04-15 11:18

在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 个回答

5

Django并没有提供直接从请求对象中获取关联数组(在Python中叫字典)的方法。正如第一个回答所说,你可以根据需要使用.getlist(),或者写一个函数,接收QueryDict,然后按照你想要的方式重新组织它(比如,如果键符合某种key[*]的模式,就提取出键值对)。

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

64

你可以查看一下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>

然后可以像这样:

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

撰写回答