Как обработать request.GET с несколькими переменными для одного и того же параметра в Django - PullRequest
63 голосов
/ 12 октября 2010

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

myvar = request.GET['myvar']

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

<class 'django.http.QueryDict'>

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

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

Вы хотите, чтобы Python list возвращался для параметра myvar, затем выполните что-то вроде этого:

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

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

5
6
7

Однако, когда вы печатаете request.GET, кажется, что он имеет list, т.е.:

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

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

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

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

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

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

Ответы [ 2 ]

148 голосов
/ 12 октября 2010

Требуется функция getlist () объекта GET:

request.GET.getlist('myvar')
1 голос
/ 22 октября 2010

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

res_set = request.GET.copy()
for item in res_set['myvar']:
    item
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...