Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP';s形括号的技巧是对Django';是吗?_Php_Python_Django - Fatal编程技术网

PHP';s形括号的技巧是对Django';是吗?

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

在PHP中,您可以创建名称如下的表单元素:

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中删除的。