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参数或域名.
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)
我认为最好用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
我对同样的问题感到困扰并找到了这个链接.显然,你的解决方案设计并不差.根据票证讨论,Django不会提供此功能.
另一种方法是使用您自己的函数以更清洁的方式执行此操作.这是讨论中陈述的内容
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)
| 归档时间: |
|
| 查看次数: |
19619 次 |
| 最近记录: |