PHP的表格括号技巧是Django的___?

时间:2010-03-26 23:37:16

标签: php python django

在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不太正确,因为它只返回一个列表,而不是字典。我也需要钥匙。

7 个答案:

答案 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()