Django эквивалент PHP form value array / ассоциативный массив
Вопрос
В 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[*]
шаблон, например).