我正在使用django 1.2,并使用urlresolvers反向方法从一个视图转到另一个视图。
url = reverse(viewOne)
我想传递一个get参数,例如
名称=“乔”
这样在viewOne中,如果我愿意
def viewOne(request):
request.GET['name']
我会得到
joe
我怎么做 ?
我正在使用django 1.2,并使用urlresolvers反向方法从一个视图转到另一个视图。
url = reverse(viewOne)
我想传递一个get参数,例如
名称=“乔”
这样在viewOne中,如果我愿意
def viewOne(request):
request.GET['name']
我会得到
joe
我怎么做 ?
Answers:
GET参数与所传回的网址无关reverse
。只需在最后添加:
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
参数作为字典放入其中。
django.utils.http.urlencode
,因为它是一个“Python的urllib.urlencode()函数可以在Unicode字符串操作的版本”功能,可能最好:docs.djangoproject.com/en/1.10/ref/utils/...
这与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'
sex=male&sex=female
?我认为应该是&sex[]=female&sex[]=female
(请注意其他内容[]
),作为GET请求数组
[]
是PHP约定。
很抱歉对此进行了延迟的更正。
虽然这两个答案都很好地处理了所需的任务,但我认为,对字典进行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('&')