2009-04-29 2 views
44

В PHP я бы сделал это, чтобы получить name как массив.Django эквивалент массива значений формы PHP/ассоциативного массива

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

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

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

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

ответ

61

Check out the QueryDict documentation, в частности использование 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'] 
+17

Это не удается, когда ключ является важным. Например name = "question [4]", где 4 - идентификатор вопроса. – Pawka

5

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

18

Извините за это, но 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']}}} 

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

+0

Это лучшее решение, которое я нашел. Спасибо. – Pawka

+2

Я полагаюсь на DotExpandedDict в своих приложениях Django, и это гораздо более полезно, чем QueryDict.getlist. К сожалению, он был удален из Django (по крайней мере, версия для разработки). Вы все же можете [захватить исходный код для него] (https://github.com/django/django/commit/c57abd3c29cedcca00821d2a0d5708f10977f3c6#django/utils/datastructures.py). – Matt

+2

DotExpandedDict удален с django 1.5 – lolesque

Смежные вопросы