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

我使用Django的1.2,并从一个视图到另一个使用urlresolvers反向的方法。

url = reverse(viewOne) 

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

name ='joe'

所以如果我这样做的话

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

我会得到

 joe 

我怎么做 ?

GET参数与reverse返回的URL无关。 最后加上它:

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

更安全更灵活的方式:

 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参数作为一个字典。

这与Amir的解决scheme非常相似,但是也处理列表。

 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' 

对不起,这个延迟更正。

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