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

我正在使用 django 1.2,并使用 urlResolvers 反向方法从一个视图切换到另一个视图。

url = reverse(viewOne)

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

Name = ‘ Joe’

所以在视野里,如果我这么做

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

我会得到

joe

我该怎么做?

45505 次浏览

GET 参数与 reverse返回的 URL 没有任何关系。只需在结尾添加它:

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

一种更安全、更灵活的方式:

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

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

很抱歉延迟了更正。

虽然这里的两个答案都很好地处理了所需的任务,但是我认为只用一个简单的函数来编写字典就是最灵活的方法:

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