我正在尝试撤消命名的网址并在其中包含查询字符串。基本上,我已经修改了登录功能,我想在其中发送?next=
。
以下是我现在正在做的事情:reverse(name) + "?next=" + reverse(redirect)
以下是我想做的事:reverse(name, kwargs = { 'next':reverse(redirect) } )
登录页面的URL(仅作为示例)如下所示:
url(r'^login/', custom_login, name = 'login'),
那么如何修改整个(或调用它)以包含下一个而不必连接它?它充其量只是一种不确定的解决方案。
答案 0 :(得分:42)
您无法在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参数或域名。
答案 1 :(得分:22)
我刚刚创建了自己的实用函数,就像问题中提到的那样:
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
答案 2 :(得分: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)
将此代码放入一些仅依赖于Django的实用程序或常用应用程序,然后导入django.core.urlresolvers.reverse而不是导入myproject.myutils.urlresolvers.reverse
答案 3 :(得分:7)
我对同样的问题感到困惑,发现了link。显然,你的解决方案设计并不差。根据票证讨论,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
在问题的情况下,它可以使用以下方式
from [myfunctions] import reverse
...
reverse('login', get={next: reverse(redirect)})
答案 4 :(得分:0)
为了使查询保持可选,您可以使用自己的函数来包装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
文件中(基于docs)for(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)
在网址conf 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>