Django эквивалент массива значений формы PHP / ассоциативный массив - PullRequest
45 голосов
/ 29 апреля 2009

В PHP я бы сделал это, чтобы получить name в виде массива.

<input type"text" name="name[]" />
<input type"text" name="name[]" />

Или, если бы я хотел получить name в качестве ассоциативного массива:

<input type"text" name="name[first]" />
<input type"text" name="name[last]" />

Что такое эквивалент Джанго для таких вещей?

Ответы [ 3 ]

62 голосов
/ 29 апреля 2009

Ознакомьтесь с документацией QueryDict , в частности, с использованием QueryDict.getlist(key).

Поскольку request.POST и request.GET в представлении являются экземплярами QueryDict, вы можете сделать это:

<form action='/my/path/' method='POST'>
<input type='text' name='hi' value='heya1'>
<input type='text' name='hi' value='heya2'>
<input type='submit' value='Go'>
</form>

Тогда как то так:

def mypath(request):
    if request.method == 'POST':
        greetings = request.POST.getlist('hi') # will be ['heya1','heya2']
18 голосов
/ 20 января 2011

Извините за это, но у Django есть utils.datastructures.DotExpandedDict. Вот часть документов:

>>> d = DotExpandedDict({'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']}}}

Единственная разница в том, что вы используете точки вместо скобок.

РЕДАКТИРОВАТЬ: этот механизм был заменен префиксами форм, но вот старый код, который вы можете добавить в свое приложение, если вы все еще хотите использовать эту концепцию: https://gist.github.com/grzes/73142ed99dc8ad6ac4fc9fb9f4e87d60

5 голосов
/ 30 апреля 2009

Django не предоставляет способ получения ассоциативных массивов (словарей в Python) из объекта запроса. Как указывалось в первом ответе, вы можете использовать .getlist() по мере необходимости или написать функцию, которая может принять QueryDict и реорганизовать его по своему вкусу (вытаскивая пары ключ / значение, если ключ соответствует некоторому шаблону key[*], например).

...