Трюк с формой в скобках PHP - это Django ___? - PullRequest
4 голосов
/ 27 марта 2010

В 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 ]

2 голосов
/ 27 марта 2010

Вы можете использовать django.utils.datastructures.DotExpandedDict со входами с именами category.1, category.2 и т. Д., Чтобы сделать что-то похожее, но я не совсем понимаю, почему, если вам когда-либо придется проверять и повторно отображать информация, которую вы получаете, при использовании django.forms.Form сделает все за вас - соответствующие поля вызовут для вас метод getlist, а аргумент prefix может использоваться для многократного использования одной и той же формы.

1 голос
/ 27 марта 2010

Вряд ли красиво, но оно должно сделать работу:

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'}
0 голосов
/ 12 марта 2011

django.utils.datastrctures имеет DotExpandedDict

Я написал форк, который разбирает словарь по скобкам ..

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()
0 голосов
/ 27 марта 2010

Я не эксперт по питонам, но вы можете попробовать

for key,value in request.POST.iteritems() 
  doSomething....
0 голосов
/ 27 марта 2010

Извините, насколько я нашел, getlist - это все, что вам нужно, но вы можете легко разобрать запрос, используя request.POST.keys(), и превратить его в словари.

0 голосов
/ 27 марта 2010

Использование request.POST.keys()

0 голосов
/ 27 марта 2010

Вы можете сделать request.POST['namefromform'] - Я так понимаю, это не то, что вы ищете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...