2012-03-06 43 views
56

我使用Django 1.2并从一个视图到另一个使用urlresolvers反向方法。我如何使用Django的urlresolvers反向传递GET参数

url = reverse(viewOne) 

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

名= '乔'

这样在viewOne如果我做

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

我会得到

joe 

我该怎么做?

+4

看看[这个答案]( http://stackoverflow.com/a/5341769/301373),给出了一个相当不错的方式来做这种事情。 – sberder 2012-09-26 03:07:40

+1

我创建了一个功能请求:https://code.djangoproject.com/ticket/25582 – guettli 2015-10-21 09:06:07

回答

103

GET参数与reverse返回的URL无关。只需添加它在最后:

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

这适用于此示例。由于没有引用完成,如果使用需要引用的值,则失败。 – guettli 2015-10-21 08:56:55

57

一个更安全和更灵活的方式:

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参数作为字典。

+4

注意: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

13

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

'sex = male&sex = female'有什么意义?我认为它应该是'&sex [] =女性和性[] =女性'(注意额外的'[]'),成为一个GET请求数组 – potatoes 2016-05-06 10:19:49

+1

@potatoes''[]''是一个PHP约定。 – 2017-02-20 12:20:13

-2

对不起有关此延迟校正。

虽然都在这里的答案处理所需的任务太清楚,我认为只是一个简单的函数来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('&') 
+0

这不会处理URL保留字符(例如'#','?')或任何类型的百分比编码:https://en.wikipedia.org/wiki/Percent-encoding – jamesc 2016-03-16 13:30:26