web-dev-qa-db-ja.com

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に対してpython myvarが返されます]を選択してから、次のようにします。

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

ただし、URLで最後に渡された値のみを取得しようとすると、つまり上記の例では567が取得され、シェルでの結果は次のようになります。

5
6
7

ただし、request.GETlistを持っているようです。つまり:

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

Ok Update:最後の値を返すように設計されています。私のユースケースはリストが必要です。

from Django docs:

QueryDict .getitem(key)指定されたキーの値を返します。キーに複数の値がある場合、getitem()は最後の値を返します。キーが存在しない場合、Django.utils.datastructures.MultiValueDictKeyErrorを発生させます。 (これはPythonの標準KeyErrorのサブクラスなので、KeyErrorのキャッチに固執することができます

QueryDict.getlist(key)Pythonリストとして、要求されたキーを持つデータを返します。キーが存在しない場合は空のリストを返します。何らかのリストを返すことが保証されています。

更新:誰かがDjango devがこれを行った理由を知っているなら、私に知らせてください。

66
ismail

GETオブジェクトの getlist() 関数が必要です。

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

別の解決策は、要求オブジェクトのコピーを作成することです...通常、request.GETまたはrequest.POSTオブジェクトを反復処理することはできませんが、コピーに対してこのような操作を行うことはできます。

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