Django эквивалент PHP form value array / ассоциативный массив

StackOverflow https://stackoverflow.com/questions/801354

Вопрос

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

Каков эквивалент Django для таких вещей?

Это было полезно?

Решение

Ознакомьтесь с документацией 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']

Другие советы

Извините, что копаюсь в этом, но у 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top