Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用django UrlResolver反向传递GET参数_Django_Get_Reverse - Fatal编程技术网

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

如何使用django UrlResolver反向传递GET参数,django,get,reverse,Django,Get,Reverse,我正在使用django 1.2,并使用URLResolver反向方法从一个视图切换到另一个视图 url = reverse(viewOne) 例如,我想传递一个get参数 name='joe' 因此,在viewOne中,如果我这样做 def viewOne(request): request.GET['name'] 我会得到 joe 我该怎么做 GET参数与reverse返回的URL无关。只需在末尾添加它: url = "%s?name=joe" % reverse(viewOne

我正在使用django 1.2,并使用URLResolver反向方法从一个视图切换到另一个视图

url = reverse(viewOne)
例如,我想传递一个get参数

name='joe'

因此,在viewOne中,如果我这样做

def viewOne(request):
    request.GET['name']
我会得到

joe

我该怎么做

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

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
然后您可以使用
构建url

url = build_url('view-name', get={'name': 'joe'})

它采用与
reverse
相同的参数,但提供了一个额外的关键字参数
get
,您可以将
get
参数作为字典放入其中。

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

很抱歉,这方面的更正延迟了

虽然这里的两个答案都很好地处理了所需的任务,但我认为仅使用一个简单的函数对字典进行URL编码是最灵活的方法:

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编码-不会处理URL保留字符(例如,
)或任何类型的百分比编码:使用
性别=男性&性别=女性有什么意义?我认为GET请求应该是
&sex[]=female&sex[]=female
(注意附加的
[]
)array@potatoes
[]
是一种PHP约定。注意:Django的
Django.utils.http.urlencode
函数可能更可取,因为它是“Python的urllib.urlencode()的版本”可以在unicode字符串上操作的函数”:我会将此函数重命名为
reverse\u with_params()
或类似的名称。