Django에서 동일한 매개 변수에 대해 여러 변수로 request.GET을 처리하는 방법


82

Django보기에서에 액세스 할 수 request.GET['variablename']있으므로보기에서 다음과 같이 할 수 있습니다.

myvar = request.GET['myvar']

실제 request.GET['myvar']개체 유형은 다음과 같습니다.

<class 'django.http.QueryDict'>

이제 동일한 매개 변수 이름으로 여러 변수를 전달하려는 경우, 즉 :

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

list매개 변수에 대해 파이썬이 반환 되기를 원 myvar하고 다음과 같이하십시오.

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

그러나, 당신은 얻을 것이다 당신이 위의 예에서 URL, 즉 전달 된 마지막 값을 얻을 때 567 , 쉘의 결과가 될 것입니다 :

5
6
7

그러나 인쇄를 request.GET할 때 listie 가있는 것처럼 보입니다 .

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

Ok 업데이트 : 마지막 값을 반환하도록 설계되었습니다. 사용 사례는 목록이 필요하다는 것입니다.

장고 문서에서 :

QueryDict. getitem (key) 주어진 키의 값을 반환합니다. 키에 둘 이상의 값이있는 경우 getitem ()은 마지막 값을 반환합니다. 키가 존재하지 않으면 django.utils.datastructures.MultiValueDictKeyError를 발생시킵니다. (이것은 Python의 표준 KeyError의 하위 클래스이므로 KeyError 포착에 충실 할 수 있습니다.

getlist (key) 요청 된 키가있는 데이터를 Python 목록으로 반환합니다. 키가 없으면 빈 목록을 반환합니다. 일종의 목록을 반환하는 것이 보장됩니다.

업데이트 : 장고 개발자가이 작업을 수행 한 이유를 아는 사람이 있으면 알려주세요. 목록을 표시하는 것은 직관적이지 않으며 목록처럼 작동하지 않습니다. 별로 비단뱀 같지 않습니다!


4
나는 당신이 목록을 기대할 것인지 아니면 개별적인 가치를 기대할 것인지를 알아야한다고 생각한다. QueryDict.getitem은 때때로 목록을 반환하지 않아야하고, 다른 경우에는 개별 항목을 반환하지 않아야합니다. 그러면 모든 사람이이를 올바르게 처리하기 위해 항상 반환 유형을 확인해야합니다.
jgiles

답변:


180

GET 객체 의 getlist () 함수를 원합니다 .

request.GET.getlist('myvar')

10
항목을 다시 게시하기 위해 jquery를 사용하는 경우 var 이름 끝에 "[]"를 추가해야 할 수 있습니다.
Danny Staple

2
나는 getlist에 대해 알고 있었지만 "[]"가 나를 던졌다. 또한 Andy Staple이라는 친구가 있는데 잠시 동안 그가 제가 생각했던 것보다 Django에 대해 더 잘 알고 있다고 생각했습니다. 그것도 저를 던졌습니다.
kungphu

1
이것은 Django 문서, Django Rest Framework 문서 및 이마에 거꾸로 게시되어야합니다. 이건 정말 방심 저를 붙 잡았다
안토니 매닝 - 프랭클린에게

아니다 확실 경우, 하나에 공을 떨어 종류의 장고처럼 보인다
NaturalBornCamper

1

또 다른 해결책은 요청 객체의 복사본을 만드는 것입니다 ... 일반적으로 request.GET 또는 request.POST 객체를 반복 할 수는 없지만 복사본에 대해 이러한 작업을 수행 할 수 있습니다.

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

2
확실합니까? 이것은 나를 위해 QueryDict의 동작을 전혀 변경하지 않습니다. 나는 단지 같은 "제한"을 가진 또 다른 QueryDict를 얻었습니다
견과류
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.