web-dev-qa-db-ja.com

Django urlresolvers reverseを使用してGETパラメーターを渡す方法

Django 1.2を使用しており、urlresolvers reverseメソッドを使用してビュー間を移動しています。

url = reverse(viewOne)

そして、例えばgetパラメータを渡したい

名前= 'joe'

そうすればviewOneで

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

私は取得します

joe

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

73
yossi

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

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

より安全で柔軟な方法:

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

build_urlを使用できます:

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

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

65
Amir Ali Akbari

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