Django中PHP表单值数组的等效实现
在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']