djangourlresolversreverseを使用してGETパラメーターを渡すにはどうすればよいですか


81

私はdjango1.2を使用しており、urlresolversのリバースメソッドを使用してあるビューから別のビューに移動しています。

url = reverse(viewOne)

たとえば、getパラメータを渡したい

名前= 'ジョー'

そうすればviewOneで

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

私は取得します

joe

それ、どうやったら出来るの ?


4
この種のことをするためのかなり良い方法を与えるその答えを見てください。
sberder 2012

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

回答:


150

GETパラメータは、によって返されるURLとは何の関係もありませんreverse。最後に追加するだけです:

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

8
これはこの例で機能します。引用は行われないため、引用が必要な値を使用すると、これは失敗します。
guettli 2015年

75

より安全で柔軟な方法:

import urllib
from django.urls import reverse


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

その後、使用することができますbuild_url

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

これはと同じ引数を取りますが、パラメータを辞書として入れることができるreverse追加のキーワード引数を提供しgetますGET


12
注:Djangoのdjango.utils.http.urlencode関数は、「Unicode文字列を操作できるPythonのurllib.urlencode()関数のバージョン」であるため、望ましい場合があります。docs.djangoproject.com
Dolan

18

これは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'

持っていることのポイントは何sex=male&sex=femaleですか?GETリクエスト配列である必要があると思います&sex[]=female&sex[]=female(追加に注意してください[]
motatoes 2016年

3
@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('&')

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