在PHP中,您可以创建名称为:
的表单元素category[1]
category[2]
甚至
category[junk]
category[test]
发布表单后,category
会自动变成一个很好的词典,如:
category[1] => "the input value", category[2] => "the other input value"
有没有办法在Django中这样做? request.POST.getlist
不太正确,因为它只返回一个列表,而不是字典。我也需要钥匙。
答案 0 :(得分:2)
您可以将django.utils.datastructures.DotExpandedDict
与名为category.1,category.2等的输入一起使用来执行类似的操作,但如果您必须验证并重新显示您的信息,我真的不明白为什么会这样做。重新接收,当使用django.forms.Form将为您完成所有事情 - 相应的字段将为您调用getlist
方法,prefix
参数可用于多次重复使用相同的表单。 / p>
答案 1 :(得分:1)
非常漂亮,但它应该完成工作:
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'}
答案 2 :(得分:0)
你可以做request.POST['namefromform']
- 我认为这不是你想要的吗?
答案 3 :(得分:0)
使用request.POST.keys()
答案 4 :(得分:0)
很抱歉,据我所知,getlist就是您想要的所有内容,但您可以使用request.POST.keys()
轻松解析请求并将其转换为词典。
答案 5 :(得分:0)
我不是python专家,但你可以尝试
for key,value in request.POST.iteritems()
doSomething....
答案 6 :(得分:0)
django.utils.datastrctures有DotExpandedDict
我编写了它的fork,用括号解析字典..
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()