2012-03-06 29 views
56

私はdjango 1.2を使用しており、urlresolvers reverseメソッドを使用して別のビューに移動しています。django urlresolvers reverseを使用してGETパラメータを渡す方法

url = reverse(viewOne) 

と私はGETパラメータを渡したい、例えば

名= 'ジョー

ようviewOneで私は

def viewOne(request): 
    request.GET['name'] 

をすれば私は得るでしょう

joe 

どうすればいいですか?

+4

([その答え]を見てみましょうhttp://stackoverflow.com/a/5341769/301373)、この種のことを行うにはやや良い方法です。 – sberder

+1

私は機能リクエストを作成しました:https://code.djangoproject.com/ticket/25582 – guettli

答えて

103

GETパラメータは、reverseによって返されるURLとは関係ありません。その後、あなたはbuild_urlを使用することができます

import urllib 
from django.core.urlresolvers import reverse 

def build_url(*args, **kwargs): 
    get = kwargs.pop('get', {}) 
    url = reverse(*args, **kwargs) 
    if get: 
     url += '?' + urllib.urlencode(get) 
    return url 

url = "%s?name=joe" % reverse(viewOne) 
+4

これはこの例では機能します。引用が行われないので、引用符で囲む必要がある値を使用すると失敗します。 – guettli

57

より安全でより柔軟な方法:ちょうど最後にそれを追加し

url = build_url('view-name', get={'name': 'joe'}) 

reverseと同じ引数をとるが、あなたのGETパラメータを辞書に入れることができる特別なキーワード引数getを提供します。

+4

注:Djangoの 'django.utils.http.urlencode'関数は、Unicode文字列で動作するPythonのurllib.urlencode()関数のバージョンであるため、これが望ましいかもしれません:https://docs.djangoproject.com/en /1.10/ref/utils/#django.utils.http.urlencode –

13

これはAmirのソリューションと非常によく似ていますが、リストも処理します。

from django.core.urlresolvers import reverse 
from django.http import QueryDict 

def build_url(*args, **kwargs): 
    params = kwargs.pop('params', {}) 
    url = reverse(*args, **kwargs) 
    if not params: return url 

    qdict = QueryDict('', mutable=True) 
    for k, v in params.iteritems(): 
     if type(v) is list: qdict.setlist(k, v) 
     else: qdict[k] = v 

    return url + '?' + qdict.urlencode() 

使用例:この上の遅れ補正のための

>>> build_url('member-list', params={'format': 'html', 'sex': ['male', 'female']}) 
u'/members/?format=html&sex=male&sex=female' 
+0

'sex = male&sex = female'はどういう意味ですか?私はそれがGETリクエスト配列であるためには '&sex [] = female&sex [] = female'(別の' [] 'に注意してください)と思う。 – potatoes

+1

@potatoes' '[]' 'はPHPの規約です。 –

-2

申し訳ありません。

両方ここでの答えはあまりにも必要なタスクを処理している間、私は辞書をURLENCODEするだけの簡単な関数は、これを行うための最も柔軟な方法であると思う:

import urllib 

def getify(dic): 
    st = '' 
    for K, V in dic.items(): 
     K = urllib.parse.quote(str(K)) 
     if isinstance(V, list): 
      for v in V: 
       st += K + '=' + urllib.parse.quote(str(v)) + '&' 
     else: 
      st += K + '=' + urllib.parse.quote(str(V)) + '&' 
    return st.rstrip('&') 
+0

これは辞書をurlencodeしません - URL予約文字(例えば '#'、 '?')や任意のタイプのパーセントエンコーディングの処理はありません:https://en.wikipedia.org/wiki/Percent-encoding – jamesc

関連する問題