我使用Django 1.2并从一个视图到另一个使用urlresolvers反向方法。我如何使用Django的urlresolvers反向传递GET参数
url = reverse(viewOne)
,我想传递一个GET参数,例如
名= '乔'
这样在viewOne如果我做
def viewOne(request):
request.GET['name']
我会得到
joe
我该怎么做?
我使用Django 1.2并从一个视图到另一个使用urlresolvers反向方法。我如何使用Django的urlresolvers反向传递GET参数
url = reverse(viewOne)
,我想传递一个GET参数,例如
名= '乔'
这样在viewOne如果我做
def viewOne(request):
request.GET['name']
我会得到
joe
我该怎么做?
GET参数与reverse
返回的URL无关。只需添加它在最后:
url = "%s?name=joe" % reverse(viewOne)
这适用于此示例。由于没有引用完成,如果使用需要引用的值,则失败。 – guettli 2015-10-21 08:56:55
一个更安全和更灵活的方式:
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
参数作为字典。
注意:Django的'django.utils.http.urlencode'函数可能更好,因为它是“可以在unicode字符串上操作的Python的urllib.urlencode()函数的版本”:https://docs.djangoproject.com/en /1.10/ref/utils/#django.utils.http.urlencode – 2016-09-01 05:21:20
这与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 [] =女性和性[] =女性'(注意额外的'[]'),成为一个GET请求数组 – potatoes 2016-05-06 10:19:49
@potatoes''[]''是一个PHP约定。 – 2017-02-20 12:20:13
对不起有关此延迟校正。
虽然都在这里的答案处理所需的任务太清楚,我认为只是一个简单的函数来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('&')
这不会处理URL保留字符(例如'#','?')或任何类型的百分比编码:https://en.wikipedia.org/wiki/Percent-encoding – jamesc 2016-03-16 13:30:26
看看[这个答案]( http://stackoverflow.com/a/5341769/301373),给出了一个相当不错的方式来做这种事情。 – sberder 2012-09-26 03:07:40
我创建了一个功能请求:https://code.djangoproject.com/ticket/25582 – guettli 2015-10-21 09:06:07