如何对当前应用程序实例进行反向 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 看起来微不足道:
- .../myapp_1/rev/ => .../myapp_1/rev/
- .../myapp_2/rev/ => .../myapp_2/rev/
我发现许多相关问题都没有很好的解决方案,例如 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()
,你仍然需要通过当前应用程序。
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 看起来微不足道:
- .../myapp_1/rev/ => .../myapp_1/rev/
- .../myapp_2/rev/ => .../myapp_2/rev/
我发现许多相关问题都没有很好的解决方案,例如 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()
,你仍然需要通过当前应用程序。