如何使用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('&')