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

Posted

技术标签:

【中文标题】我如何使用 django urlresolvers 反向传递 GET 参数【英文标题】:How do i pass GET parameters using django urlresolvers reverse 【发布时间】:2012-03-24 00:53:32 【问题描述】:

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

url = reverse(viewOne)

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

name = '乔'

如果我这样做了,那么在 viewOne 中

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

我会得到

joe

我该怎么做?

【问题讨论】:

看看that answer,它提供了一种相当不错的方法来做这种事情。 我创建了一个功能请求:code.djangoproject.com/ticket/25582 【参考方案1】:

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

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

【讨论】:

这适用于这个例子。由于没有完成引用,因此如果您使用需要引用的值,则会失败。【参考方案2】:

更安全、更灵活的方式:

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

【讨论】:

注意:Django 的 django.utils.http.urlencode 函数可能更可取,因为它是“可以对 unicode 字符串进行操作的 Python 的 urllib.urlencode() 函数版本”:docs.djangoproject.com/en/1.10/ref/utils/… 我会将此函数重命名为 reverse_with_params() 或类似名称。【参考方案3】:

这与 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请求数组 @potatoes []php 约定。【参考方案4】:

抱歉,对此延迟更正。

虽然这里的两个答案都很好地处理了所需的任务,但我认为只是一个简单的函数来对字典进行 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('&')

【讨论】:

not 对字典进行 urlencode - 不处理 URL 保留字符(例如 #?)或任何类型的百分比编码:en.wikipedia.org/wiki/Percent-encoding

以上是关于我如何使用 django urlresolvers 反向传递 GET 参数的主要内容,如果未能解决你的问题,请参考以下文章

错误:'没有名为'django.core.urlresolvers'的模块

Django 中的 login_required 装饰器和 urlresolver.reverse()

我不知道何时在 django.core.urlresolvers 模块中使用 reverse()

ImportError:没有名为'django.core.urlresolvers'的模块:但是先天

django.core.urlresolver.reverse - NoReverseMatch:“...”的反向参数“()”和关键字参数“”未找到

django locale-url import error cannot import name 'urlresolvers' from 'django.core'