[django] 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

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 목록으로 반환합니다. 키가 없으면 빈 목록을 반환합니다. 일종의 목록을 반환하는 것이 보장됩니다.

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



답변

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

request.GET.getlist('myvar')


답변

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

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


답변