2015-09-26 77 views
1

Django的版本:1.8或1.9如何制作当前应用程序实例的反向URL?

重新使用myapp几次基于不同的URL在mysite/urls.py有:

url(r'^myapp_1/', include('myapp.urls')), 
url(r'^myapp_2/', include('myapp.urls')), 

myapp/urls.py是:

url('^rev/$', views.rev, name='rev'), 

所以我需要做一个反向的URL,如reverse('rev'),它在同一个myapp instan中创建一个反向URL CE,这对于不同的网址看起来微不足道:

  • .../myapp_1 /转/ => .../myapp_1 /转/
  • .../myapp_2 /转/ => .../myapp_2 /转/

,我发现了一些相关的问题都没有一个很好的解决方案,像thisthis,但他们似乎是更老的Django版本比1.8/1.9,并且看起来相反的URL计划已经改变。然而,我还没有能够破译Django documentation on Reversing namespaced URLs来提供这个功能,我认为这是微不足道的,所以任何帮助表示赞赏。

回答

1

可以包括myapp.urls两次,使用相同的应用程序的命名空间,但不同的实例命名空间:

url(r'^myapp_1/', include('myapp.urls', namespace='myapp1', app_name='myapp')), 
url(r'^myapp_2/', include('myapp.urls', namespace='myapp2', app_name='myapp')), 

然后,在你的代码,使用应用程序的命名空间反向链接,并通过当前实例命名空间在current_app参数:

reverse('myapp:rev', current_app=request.resolver_match.namespace) 

当使用在模板中{% url %}标签,你不能直接传递当前的命名空间,但是你可以设置current_app属性Ø n请求相同的效果:

# in your view 
request.current_app = request.resolver_match.namespace 

# in your template 
{% url 'myapp:rev' %} 

在1.9中,这个已经稍微改变了。您可以指定在包含URL配置app_name,并在呼叫namespaceinclude(),像这样:

mysite/urls.py

url(r'^myapp_1/', include('myapp.urls', namespace='myapp1')), 
url(r'^myapp_2/', include('myapp.urls', namespace='myapp2')), 

myapp/urls.py

app_name = 'myapp' 
urlpatterns = [ 
    url('^rev/$', views.rev, name='rev'), 
] 

在1.9另一个变化是, {% url %}模板标签现在默认使用当前请求的名称空间。如果您需要在相同的名称空间中反转网址,则不必再明确设置request.current_app。如果您使用reverse(),您仍然需要传递当前的应用程序。

+0

感谢您的详细描述。我在Django ver上试过这个。 1.8.4,并且适用于'reverse'和'{%url%}'。看起来像版本。 1.9更新是合理的,所以应用程序本身可以定义应用程序。名称空间,它将在内部使用反向或URL调用。 – EquipDev

0

在你的urls.py中使用namespaces

编辑:你链接的答案看起来不错。这些具体问题是什么?如果有差异,我将版本1.8的文档链接起来。

+0

像'url(r'^ myapp_1 /',包括('myapp.urls',namespace ='myapp_1'))这样的命名空间如何能够根据视图中相同的代码生成不同的反向URL ? – EquipDev

相关问题