7

request.GETからパラメータを除外する最良の方法は何ですか?

たとえば、URLパラメータが与えられ、?a=a&b=b&c=cパラメータbを取り出して、?a=a&c=c変更せずにURLパラメータを生成したいrequest.GET

今、私はキーをループしてbを取り出しています

params = {}
for key,value in request.GET.items():
  if not key == 'b':
    params[key] = value

url = urllib.urlencode(params)

同じ結果を達成するためのより良い、よりエレガントな方法があるかどうか疑問に思っていますか?例えば。

request.GET.urlencode(exclude=['b',])

またはこれでさえ、より良い

urllib.urlencode(request.GET.exclude('b'...)
4

3 に答える 3

12

これは機能するはずです:

get = request.GET.copy()
del get['b']

params = urllib.urlencode(get)
于 2012-08-31T02:09:13.133 に答える
2

request.GET不変であるため、直接操作することはできませんQueryDict。したがって、浅いコピーを作成してから、目的のキーを削除します。

cp = request.GET.copy()
cp.pop('b')

params = urllib.urlencode(cp)
于 2012-08-31T02:20:39.963 に答える
1

QueryDictこれらの答えはすべてほぼ正解でしたが、同じキー名を持つ複数のパラメーターが存在するエッジケースでは失敗しました。これは有効です(そして、djangoがではなくaを使用する理由全体dict)。urllibを使用するurlencodeと、余分なパラメーターが失われるため、によって提供されるurlencodeを使用する必要がありますQueryDict

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.QueryDict

QueryDictは、同じキーの複数の値を処理するようにカスタマイズされた辞書のようなクラスです。これが必要なのは、一部のHTMLフォーム要素、特に<select multiple="multiple">、同じキーに複数の値を渡すためです。

したがって、正しい方法は次のとおりです。

querydict = request.GET.copy()
if 'b' in querydict:
    del querydict['b']
return querydict.urlencode()
于 2013-10-22T15:42:13.963 に答える