PHP';s形括号的技巧是对Django';是吗?
在PHP中,您可以创建名称如下的表单元素:PHP';s形括号的技巧是对Django';是吗?,php,python,django,Php,Python,Django,在PHP中,您可以创建名称如下的表单元素: category[1] category[2] 甚至 category[junk] category[test] 发布表单时,类别会自动转换为一个漂亮的字典,如: category[1] => "the input value", category[2] => "the other input value" 在Django有办法做到这一点吗request.POST.getlist不太正确,因为它只返回一个列表,而不是一个字典。我也需要
category[1]
category[2]
甚至
category[junk]
category[test]
发布表单时,类别
会自动转换为一个漂亮的字典,如:
category[1] => "the input value", category[2] => "the other input value"
在Django有办法做到这一点吗
request.POST.getlist
不太正确,因为它只返回一个列表,而不是一个字典。我也需要钥匙。你可以做请求。POST['namefromform']
-我想这不是你要找的?使用request.POST.keys()
抱歉,据我所知,getlist是你想要的全部,但是你可以使用request.POST.keys()轻松解析请求
并将它们转换成字典。我不是python专家,但你可以试试
for key,value in request.POST.iteritems()
doSomething....
虽然不太漂亮,但它应该能完成任务:
import re
def getdict(d, pref):
r = re.compile(r'^%s\[(.*)\]$' % pref)
return dict((r.sub(r'\1', k), v) for (k, v) in d.iteritems() if r.match(k))
D = {
'foo[bar]': '123',
'foo[baz]': '456',
'quux': '789',
}
print getdict(D, 'foo')
# Returns: {'bar': '123', 'baz': '456'}
您可以使用名为category.1、category.2等的输入来执行类似的操作,但我不明白如果您必须验证并重新显示您收到的信息,为什么会这样做,当使用django.forms.Form时,它将为您做所有事情-适当的字段将为您调用
getlist
方法,并且prefix
参数可用于多次重复使用同一表单。class BrExpandedDict(dict):
"""
A special dictionary constructor that takes a dictionary in which the keys
may contain brackets to specify inner dictionaries. It's confusing, but this
example should make sense.
>>> d = BrExpandedDict({'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']}}}
>>> d['person']
{'1': {'lastname': ['Willison'], 'firstname': ['Simon']}, '2': {'lastname': ['Holovaty'], 'firstname': ['Adrian']}}
>>> d['person']['1']
{'lastname': ['Willison'], 'firstname': ['Simon']}
"""
def __init__(self, key_to_list_mapping):
for k, v in key_to_list_mapping.items():
current = self
k = k.replace(']', '')
bits = k.split('[')
for bit in bits[:-1]:
current = current.setdefault(bit, {})
# Now assign value to current position
try:
current[bits[-1]] = v
except TypeError: # Special-case if current isn't a dict.
current = {bits[-1]: v}
if __name__ == "__main__":
import doctest
doctest.testmod()
我知道:)问题是我没有提前知道钥匙。表单上的输入元素是动态生成的,问题是我得到了所有的键。我只想要与一组相关表单元素相关联的键(比如PHP是如何实现的),恐怕我必须这样做。似乎还有更好的办法!我认为这与
request.POST.getlist
没有什么不同。请注意PHP输入的名称、键和值是如何在2012年7月从Django 1.5中删除的。