Django эквивалент массива значений формы PHP/ассоциативного массива
В 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 для таких вещей?
Ответы
Ответ 1
Проверьте документацию 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']
Ответ 2
Извините за это, но 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']}}}
Единственное различие заключается в использовании точки вместо скобок. Я думаю, что теперь концептуально заменяется префиксными формами в наборах форм, но класс остается в базе кода.
Ответ 3
Django не предоставляет способ получения ассоциативных массивов (словарей в Python) из объекта запроса. Как указывалось в первом ответе, вы можете использовать .getlist()
по мере необходимости или написать функцию, которая может принимать QueryDict
и реорганизовать ее по своему вкусу (вытаскивая пары ключ/значение, если ключ соответствует какому-то шаблону key[*]
например).