如何使用django UrlResolver反向传递GET参数
我正在使用django 1.2,并使用URLResolver反向方法从一个视图切换到另一个视图如何使用django UrlResolver反向传递GET参数,django,get,reverse,Django,Get,Reverse,我正在使用django 1.2,并使用URLResolver反向方法从一个视图切换到另一个视图 url = reverse(viewOne) 例如,我想传递一个get参数 name='joe' 因此,在viewOne中,如果我这样做 def viewOne(request): request.GET['name'] 我会得到 joe 我该怎么做 GET参数与reverse返回的URL无关。只需在末尾添加它: url = "%s?name=joe" % reverse(viewOne
url = reverse(viewOne)
例如,我想传递一个get参数
name='joe'
因此,在viewOne中,如果我这样做
def viewOne(request):
request.GET['name']
我会得到
joe
我该怎么做 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
然后您可以使用构建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'
很抱歉,这方面的更正延迟了 虽然这里的两个答案都很好地处理了所需的任务,但我认为仅使用一个简单的函数对字典进行URL编码是最灵活的方法:
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('&')
看一看,它提供了一种很好的方法来做这类事情。由于不进行引用,如果您使用需要引用的值,则此操作将失败。这不会对字典进行URL编码-不会处理URL保留字符(例如,
,?
)或任何类型的百分比编码:使用性别=男性&性别=女性有什么意义?我认为GET请求应该是&sex[]=female&sex[]=female
(注意附加的[]
)array@potatoes[]
是一种PHP约定。注意:Django的Django.utils.http.urlencode
函数可能更可取,因为它是“Python的urllib.urlencode()的版本”可以在unicode字符串上操作的函数”:我会将此函数重命名为reverse\u with_params()
或类似的名称。