it-swarm.com.ru

Обработка Django request.GET и нескольких переменных для одного и того же имени параметра

В представлении Django и ​​т.д. Вы можете получить доступ к request.GET ['variablename'] , поэтому, по вашему мнению, вы можете вернуться сделать что-то вроде этого:

myvar = request.GET['myvar']

Фактический тип объекта request.GET ['myvar']:

<class 'Django.http.QueryDict'>

Теперь, если вы хотите передать несколько переменных для одного и того же имени параметра, т.е.

http://example.com/blah/?myvar=123&myvar=567

Другими словами, вы хотели бы получить список python для параметра myvar

По сути, то, что я хотел бы сделать, это что-то вроде этого

 for var in request.GET['myvar']:
     print var

Однако, если вы попытаетесь получить последнее значение, переданное в URL, т.е. в приведенном выше примере, вы получите 567

и результат в оболочке будет:

5
6
7

Однако, когда вы печатаете request.GET, создается впечатление, что у него есть список, т.е.

<QueryDict: {u'myvar': [u'123', u'567']}>

Ok Update: он предназначен для возврата последнего значения, мой вариант использования мне нужен список.

из Django документов:

QueryDict. getitem (ключ) Возвращает значение для данного ключа. Если ключ имеет более одного значения, getitem () возвращает последнее значение. Вызывает Django.utils.datastructures.MultiValueDictKeyError, если ключ не существует. (Это подкласс стандартного KeyError в Python, так что вы можете продолжать ловить KeyError

QueryDict.getlist (key) Возвращает данные с запрошенным ключом в виде списка Python. Возвращает пустой список, если ключ не существует. Он гарантированно вернет какой-то список.

Обновление: если кто-то знает, почему Django разработчики сделали это, пожалуйста, дайте мне знать, кажется, что показывать список нелогично, и он не ведет себя как один. Не очень Pythonic!

61
ismail

Вам нужна функция getlist () объекта GET:

request.GET.getlist('myvar')
145
AndrewF

Другим решением является создание копии объекта запроса ... Как правило, вы не можете выполнять итерацию по объекту request.GET или request.POST, но вы можете выполнять такие операции с копией:

res_set = request.GET.copy()
for item in res_set['myvar']:
    item
...
1
FallenAngel