2010-10-11 2 views
48

В целях Джанго и т.д. Вы можете получить доступ к request.GET [ «»] VARIABLENAME, поэтому на ваш взгляд, вы можете вернуться сделать что-то вроде этого:Обработка Django request.GET и несколько переменных для того же имени параметра

myvar = request.GET['myvar'] 

фактическое request.GET [ «MyVar»] тип объекта:

<class 'django.http.QueryDict'> 

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

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

Другими словами, вы хотели бы список питон возвращенное для параметра MyVar

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

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

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

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

5 
6 
7 

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

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

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

из Джанго документы:

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

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

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

+2

Я думаю, что рассуждение состоит в том, что вы должны знать, следует ли ожидать список или индивидуальное значение. QueryDict.getitem не должен возвращать список иногда, отдельный элемент в другое время - тогда каждый всегда должен будет проверить его тип возврата, чтобы правильно его обрабатывать. – jgiles

ответ

112

Вы хотите getlist() функцию объекта GET:

request.GET.getlist('myvar') 
+5

Возможно, вам понадобится добавить «[]» в конец имени var, если вы используете jquery для отправки элементов назад. –

+1

Я знал о getlist, но «[]» бросил меня. Кроме того, у меня есть друг по имени Энди Стэпл, и на секунду я подумал, что он знает, как он больше разбирается в Django, чем я понял. Это меня тоже бросило. – kungphu

+1

Это нужно поместить на все документы Django, документы Django Rest Framework и назад на моем лбу. Это на самом деле натолкнуло меня на охрану. –

1

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

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

вы уверены? это не меняет поведение QueryDict для меня. я просто получаю еще один QueryDict с тем же «ограничением», – nuts

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