如何对当前应用程序实例进行反向 URL?

How to make reverse URL to current instance of application?

Django 版本:1.8 或 1.9

根据 mysite/urls.py 中的不同 URL 多次重复使用 myapp,其中:

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 实例中创建一个反转 URL,对于不同的 URLs 看起来微不足道:

我发现许多相关问题都没有很好的解决方案,例如 this and this, but they appear to be for much older Django versions than 1.8/1.9, and it appears that the reverse URL scheme has changed. However, I have not been able to decipher the Django documentation on Reversing namespaced URLs 提供此功能,我认为这很微不足道,因此不胜感激。

在你urls.py中使用namespaces

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

您可以包含 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 中,这略有改变。您在包含的 url 配置中指定 app_name,并在对 include() 的调用中指定 namespace,如下所示:

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 %}模板标签现在默认使用当前请求的命名空间。如果您需要在同一命名空间中反转 url,则不再需要显式设置 request.current_app。如果你使用 reverse(),你仍然需要通过当前应用程序。