如何使用django urlresolvers反向传递GET参数

yos*_*ssi 75 django reverse get

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

url = reverse(viewOne)
Run Code Online (Sandbox Code Playgroud)

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

name ='joe'

所以在视图中如果我这样做

def viewOne(request):
    request.GET['name']
Run Code Online (Sandbox Code Playgroud)

我会得到

joe
Run Code Online (Sandbox Code Playgroud)

我怎么做 ?

Dan*_*man 135

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

url = "%s?name=joe" % reverse(viewOne)
Run Code Online (Sandbox Code Playgroud)

  • 这适用于此示例.由于没有引用,如果您使用需要引用的值,则会失败. (7认同)

Ami*_*ari 67

更安全,更灵活的方式:

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
Run Code Online (Sandbox Code Playgroud)

然后你可以使用build_url:

url = build_url('view-name', get={'name': 'joe'})
Run Code Online (Sandbox Code Playgroud)

它采用相同的参数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 (10认同)

cli*_*ime 15

这与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()
Run Code Online (Sandbox Code Playgroud)

用法示例:

>>> build_url('member-list', params={'format': 'html', 'sex': ['male', 'female']})
u'/members/?format=html&sex=male&sex=female'
Run Code Online (Sandbox Code Playgroud)

  • @potatoes的[]是PHP约定。 (3认同)