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