在django.core.urlresolvers reverse()调用中包含一个查询字符串

Bri*_*cks 38 django reverse urlconf

我正在尝试撤消命名的URL并在其中包含查询字符串.基本上,我已经修改了登录功能,我想发送?next=它.

这就是我现在正在做的事情: reverse(name) + "?next=" + reverse(redirect)

这是我想做的事情: reverse(name, kwargs = { 'next':reverse(redirect) } )

我的登录页面的URL(仅作为示例)如下所示:

url(r'^login/', custom_login, name = 'login'),

那么如何修改整个(或调用它)以包含下一个而不必连接它?它充其量只是一种不确定的解决方案.

Yuj*_*ita 44

您无法在url confs中捕获GET参数,因此您的方法是正确的.

我通常更喜欢字符串格式,但它是一样的.
"%s?next=%s" % (reverse(name), reverse(redirect))

http://docs.djangoproject.com/en/dev/topics/http/urls/#what-the-urlconf-searches-against

URLconf将搜索请求的URL,作为普通的Python字符串.这不包括GET或POST参数或域名.

  • 这是错误的。URL参数需要进行编码,如`"%s?%s" % (reverse(name), urlencode({"next": reverse(redirect)})`。 (4认同)

Dan*_*man 23

我刚刚创建了自己的实用函数,就像问题中提到的那样:

from django.utils.http import urlencode

def my_reverse(viewname, kwargs=None, query_kwargs=None):
    """
    Custom reverse to add a query string after the url
    Example usage:
    url = my_reverse('my_test_url', kwargs={'pk': object.id}, query_kwargs={'next': reverse('home')})
    """
    url = reverse(viewname, kwargs=kwargs)

    if query_kwargs:
        return u'%s?%s' % (url, urlencode(query_kwargs))

    return url
Run Code Online (Sandbox Code Playgroud)

  • 在 python3 中,最快的方法是 `f'{url}?{urlencode(query_kwargs)}'` (3认同)

Ala*_*ing 7

我认为最好用Django的反向方法来公开这个API.这是一些简单的代码:

from django.core.urlresolvers import reverse as django_reverse

def reverse(viewname, urlconf=None, args=None, kwargs=None, prefix=None, current_app=None):
    """
    Wrapper of django.core.urlresolvers.reverse that attaches arguments in kwargs as query string parameters
    """
    if kwargs:
        return '%s?%s' % (django_reverse(viewname, urlconf, args, None, prefix, current_app), \
                        '&'.join(['%s=%s' % (k,v) for k,v in kwargs.items()]))
    else:
        return django_reverse(viewname, urlconf, args, kwargs, prefix, current_app)
Run Code Online (Sandbox Code Playgroud)

将此代码放入一些仅依赖于Django的实用程序或常用应用程序,然后导入django.core.urlresolvers.reverse而不是导入myproject.myutils.urlresolvers.reverse


Nod*_*era 7

我对同样的问题感到困扰并找到了这个链接.显然,你的解决方案设计并不差.根据票证讨论,Django不会提供此功能.

你可以使用urlobjectfurl.

另一种方法是使用您自己的函数以更清洁的方式执行此操作.这是讨论中陈述的内容

from django.utils.http import urlencode
from django.core.urlresolvers import reverse as original_reverse

def reverse(*args, **kwargs):
    get = kwargs.pop('get', {})
    url = original_reverse(*args, **kwargs)

    if get:
        url += '?' + urlencode(get)

    return url
Run Code Online (Sandbox Code Playgroud)

在问题的情况下,它可以使用以下方式

from [myfunctions] import reverse
...
reverse('login', get={next: reverse(redirect)})
Run Code Online (Sandbox Code Playgroud)