Подход формы формы PHP к Django's ___?

В 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 не совсем прав, потому что он просто возвращает список, а не словарь. Мне тоже нужны ключи.

Solutions Collecting From Web of "Подход формы формы PHP к Django's ___?"

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

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

 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'} 

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

Использовать request.POST.keys()

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

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

 for key,value in request.POST.iteritems() doSomething.... 

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