如何使用django urlresolvers反向传递GET参数

时间:2012-03-06 14:22:57

标签: django get reverse

我正在使用django 1.2并使用urlresolvers反向方法从一个视图转到另一个视图。

url = reverse(viewOne)

我想传递一个get参数,例如

  

name ='joe'

以便在viewOne中如果我这样做

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

我会得到

joe

我该怎么做?

4 个答案:

答案 0 :(得分:124)

GET参数与reverse返回的URL无关。只需在最后添加它:

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

答案 1 :(得分:62)

更安全,更灵活的方式:

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参数作为字典放入其中。

答案 2 :(得分:14)

这与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'

答案 3 :(得分:-3)

很抱歉对此进行了延迟更正。

虽然这里的答案都很好地处理了所需的任务,但我认为只需要一个简单的函数来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('&')