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パラメータに対してPythonを返したいmyvar場合は、次のようにします。

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

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

5
6
7

ただし、印刷request.GETすると、次のようになりますlist

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

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

djangoドキュメントから:

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

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

更新:django devがこれを行った理由を誰かが知っている場合は、私に知らせてください。リストを表示するのは直感に反しているようで、リストのようには動作しません。あまりパイソンではありません!


4
その理由は、リストと個々の値のどちらを期待するかを知っておく必要があるからだと思います。QueryDict.getitemは、リストを返すこともあれば、個々のアイテムを返すこともありません。その場合、適切に処理するために、全員が常に戻り値の型を確認する必要があります。
jgiles 2013年

回答:


181

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

request.GET.getlist('myvar')

10
jqueryを使用してアイテムをポストバックする場合は、変数名の末尾に「[]」を追加する必要がある場合があります。
ダニーステープル2013

2
getlistについては知っていましたが、「[]」が私を投げました。また、Andy Stapleという名前の友達がいて、彼は私が思っていたよりもDjangoについてもっとよく知っていると一瞬思いました。それも私を投げました。
kungphu 2016年

1
これは、Djangoのドキュメント、Django Rest Frameworkのドキュメント全体、および額の後ろにポスターを貼る必要があります。これは本当に私
Anthony Manning-Franklin

ジャンゴがボールをそのボールに落としたようですが、意図したかどうかは
わかり

1

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

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

2
本気ですか?これは、QueryDictの動作をまったく変更しません。同じ「制限」を持つ別のQueryDictを取得します
ナッツ

0

同じパラメータ(チェックボックスのセットなど)の複数の値を含むQueryDictオブジェクトからクエリ文字列を作成する場合は、urlencode()メソッドを使用します。

たとえば、受信クエリリクエストを取得し、パラメータを削除して、更新されたクエリ文字列を結果のページに返す必要がありました。

# Obtain a mutable copy of the original string
original_query = request.GET.copy()

# remove an undesired parameter
if 'page' in original_query:
    del original_query['page']

これで、元のクエリに次のように同じパラメータの値が複数ある場合:{... 'track_id':['1'、 '2']、...}コードを使用すると、クエリ文字列の最初の要素が失われますお気に入り:

new_query = urllib.parse.urlencode(original_query)

結果は...

...&track_id=2&...

ただし、複数の値を適切に含めるために、QueryDictクラスのurlencodeメソッドを使用できます。

new_query = original_query.urlencode()

生成する...

...&track_id=1&track_id=2&...
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.