如何制作反向URL到当前的应用程序实例?

时间:2015-09-26 16:30:30

标签: django django-urls

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实例中创建一个反向网址,对于不同的网址,这个网址看起来很简单:

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

我发现了很多相关的问题,没有一个很好的解决方案,比如thisthis,但它们似乎是用于比1.8 / 1.9更旧的Django版本,而且看起来反向的URL计划已经改变。但是,我无法破译Django documentation on Reversing namespaced URLs来提供此功能,我认为这是微不足道的,所以任何帮助都会受到赞赏。

2 个答案:

答案 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版本的文档链接起来。