我如何使用Django URLResolvers反向传递GET参数


81

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

url = reverse(viewOne)

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

名称=“乔”

这样在viewOne中,如果我愿意

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

我会得到

joe

我怎么做 ?


4
看一下这个答案,它为完成这种事情提供了一种不错的方法。
sberder 2012年

1
我创建了一个功能请求:code.djangoproject.com/ticket/25582
guettli 2015年

Answers:


149

GET参数与所传回的网址无关reverse。只需在最后添加:

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

8
这适用于此示例。由于没有引用,所以如果使用需要引用的值,则失败。
guettli 2015年

75

一种更安全,更灵活的方法:

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


12
注:Django的django.utils.http.urlencode,因为它是一个“Python的urllib.urlencode()函数可以在Unicode字符串操作的版本”功能,可能最好:docs.djangoproject.com/en/1.10/ref/utils/...
杜兰Antenucci

17

这与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请求数组
motatoes,2016年

3
@potatoes[]是PHP约定。
乔纳斯·谢弗(JonasSchäfer)

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

1
这并URLEncode的词典-没有处理URL的保留的字符(例如#?)或任何类型的编码的百分比:en.wikipedia.org/wiki/Percent-encoding
jamesc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.