【问题标题】:How to make reverse URL to current instance of application?如何为当前应用程序实例创建反向 URL?
【发布时间】:2015-12-24 07:12:34
【问题描述】:

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,对于不同的 URL,这看起来微不足道:

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

我发现了一些没有很好解决方案的相关问题,例如thisthis,但它们似乎适用于比 1.8/1.9 更早的 Django 版本,而且反向 URL 方案似乎已经改变。但是,我无法破译 Django documentation on Reversing namespaced URLs 来提供此功能,我认为这是微不足道的,因此不胜感激。

【问题讨论】:

    标签: django django-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')),
    

    然后,在您的代码中,使用应用程序命名空间反转 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 ver 上试过这个。 1.8.4,并且适用于reverse{% url %}。看起来像版本。 1.9更新是合理的,所以应用程序本身可以定义应用程序。它将在反向或 url 调用中内部使用的命名空间。
    【解决方案2】:

    在你的 urls.py 中使用 namespaces

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

    【讨论】:

    • url(r'^myapp_1/', include('myapp.urls', namespace='myapp_1')) 这样的命名空间如何使基于视图中相同的代码生成不同的反向 URL 成为可能?
    猜你喜欢
    • 2022-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多