在 django.core.urlResolvers return()调用中包含一个 query 字符串

我试图反转一个命名的 URL,并在其中包含一个查询字符串。基本上,我已经修改了 login 函数,我想在其中发送 ?next=

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

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

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

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

那么,我如何修改这整个事情(或调用它) ,以包括下一个,而不必连接它?充其量只是个不确定的解决方案。

40064 次浏览

您无法在 url cons 中捕获 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 参数或域名。

我认为最好包装 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)

将这段代码放入一些只依赖于 Django 的实用程序或普通应用程序中,然后不导入 Django.core.urlResolvers.return,而只导入 myproject.myutils.urlResolvers.verse

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

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 f'{url}?{urlencode(query_kwargs)}'


return url

同样的问题困扰着我,我发现了这个 链接。显然,你的解决方案设计得一点也不差。根据票据讨论,Django 不会提供这个功能。

你可以使用 Urlobproject或者

另一种方法是使用您自己的函数,以一种更清晰的方式来完成这项工作。这是讨论中提到的

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

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

from [myfunctions] import reverse
...
reverse('login', get={next: reverse(redirect)})

为了保持查询的可选性,您可以将 Django 的反向函数包装为您自己的函数,该函数也可以处理查询,从而允许对反向函数进行其他正确的处理。

创建一个正确的请求-注意,query_kwargs是可选的,所以你不必发送它

# from a views in views.py
def sendingView(request, truckID, fleetSlug):
#in the GET or POST
return HttpResponseRedirect(reverse('subAppName:urlViewName',
kwargs={'anyPassedKawrgs':goHere,…},
query_kwargs={'queries': goHere}
))


# from a template in specificTemplate.html
<a class="nav-link" href="{% url 'subAppName:urlViewName' kwarg1=kwarg1 kwarg2=kwarg2 … query_kwargs={'dict':here} %}">Link</a>


#from a model in models.py
class Truck(models.Model):
name = models.CharField(…)
def get_absolute_wi_url(self):
return reverse('subAppName:urlViewName', kwargs={'kwarg1':kwarg1,'kwarg2':kwarg2})

utils.py文件(基于 医生)中为(1.11及以上?)

-myMainApp
-apps
-static
...
-utils
-__init__.py
-utils.py


from django.core.urlresolvers import reverse as django_reverse


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

在网址保密 urls.py

app_name = 'subAppName'
urlpatterns = [
url(r'^(?P<kawrg1>[a-zA-Z0-9]+)/(?P<kawrg2>[a-zA-Z0-9]+)/path/to/here/$', views.urlViewFunctionName, name='urlViewName'),

并获得对查询的访问权限

#in a view
def urlViewFunctionName(request, kwarg1, kwarg2):
if request.GET.get('submittedData'):
submittedQuery = request.GET.get('submittedData')
else:
submittedQuery = None
return render(request, 'trucks/weeklyInspectionSuccess.html', {
'truck': truck,
'submittedQuery': submittedQuery
})


#in a template
<div class="container">
Success for \{\{kwarg1}}
\{\{submittedQuery}}
</div>

按照@chrisFrisina 的想法,稳健的解决方案是:

from django.core import urlresolvers
from urllib.parse import urlencode




def reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None, query_kwargs=None):
base = urlresolvers.reverse(viewname, urlconf, args, kwargs, current_app)
if query_kwargs:
query = urlencode(query_kwargs)
return f'{base}?{query}'
else:
return base