Django版本:1.8或1.9
根据myapp
中的不同网址,多次重复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'),
因此,我需要制作一个反向的网址,例如reverse('rev')
,它会在同一个myapp
实例中创建一个反向网址,对于不同的网址,这个网址看起来很简单:
我发现了很多相关的问题,没有一个很好的解决方案,比如this和this,但它们似乎是用于比1.8 / 1.9更旧的Django版本,而且看起来反向的URL计划已经改变。但是,我无法破译Django documentation on Reversing namespaced URLs来提供此功能,我认为这是微不足道的,所以任何帮助都会受到赞赏。
答案 0 :(得分:2)
您可以使用相同的应用程序命名空间,但使用不同的实例命名空间,包括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')),
然后,在您的代码中,使用应用程序命名空间反转url,并在current_app
参数中传递当前实例名称空间:
reverse('myapp:rev', current_app=request.resolver_match.namespace)
在模板中使用{% url %}
标记时,您无法直接传递当前命名空间,但可以在请求上设置current_app
属性以获得相同的效果:
# in your view
request.current_app = request.resolver_match.namespace
# in your template
{% url 'myapp:rev' %}
在1.9中,这有点变化。您在包含的网址配置中指定了app_name
,在namespace
的通话中指定了include()
,如下所示:
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()
,仍需要传递当前应用。
答案 1 :(得分:0)
在你的urls.py中使用namespaces。
编辑:您链接的答案看起来不错。这些具体问题是什么?如果存在差异,我会将1.8版本的文档链接起来。