【问题标题】:Can I reference project URLs in Django templates by providing the project name?我可以通过提供项目名称来引用 Django 模板中的项目 URL 吗?
【发布时间】:2019-05-16 10:51:04
【问题描述】:

我有一个名为 reports 的 Django 项目,其中包含 report_1report_2 等应用程序。

由于某些原因,我想将项目视为一个应用程序,所以我在report_1report_2 旁边添加了reportsINSTALLED_APPS,并且还在views.py 文件中创建了templates 文件夹主项目文件夹(settings.py 所在的位置)。

urls.py我添加了app_name = reports

但是,只有当我跳过应用程序名称时,从模板中调用 url 才会起作用:所以{% url 'reports:index' %} 会抛出

'reports' 不是注册的命名空间'

错误,但{% url 'index' %} 会起作用。

为什么会这样?我以为 Django 会遍历 INSTALLED_APPS 中列出的所有应用程序,查找 app_name(已提供)并将其与 URL 名称匹配。

【问题讨论】:

  • I want to treat the project as an app请详细说明您的意图。
  • @IvanStarostin:我希望它有自己的视图、模板等
  • 一种常见的方法是创建一个应用程序(例如core,并将其用于项目的视图/模板/url,而不是将project添加到INSTALLED_APPS。如果你真的想添加项目目录到INSTALLED_APPS 并使用命名空间,我在下面的答案中建议了一个解决方案。
  • 这是similar question

标签: python django


【解决方案1】:

app_name 在根 url 配置中不起作用。请参阅 django-developers 邮件列表中的 ticket 28413this discussion

如果您真的想在 report 命名空间下包含一些模式,您可以包含一个包含 url 模式列表和命名空间的 2 元组。

reports_patterns = ([
    path('myurl', views.my_view, name='myview'),
], 'reports')

urlpatterns = [
    ...
    path('', include(reports_patterns)
    ...
]

然后您可以在模板中使用{% url 'reports:myview' %}

有关更多信息,请参阅URL namespaces and included URLconfs 上的文档

【讨论】:

    【解决方案2】:

    你可以添加:

    app_name = 'polls'
    

    在上面的 urls.py 中您正在使用哪个应用程序:

        urlpatterns=[
    ....
    ]
    

    然后在您需要加载模板的每个地方使用:

    {% url 'appname:index.html' %}
    

    【讨论】:

    • 问题是在根urls.py添加app_name不起作用
    • 改为在应用内的 URLs.py 中添加 app_name
    猜你喜欢
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 2022-11-17
    • 2014-01-02
    • 2015-12-03
    • 2011-01-12
    • 2021-02-02
    • 2018-06-08
    相关资源
    最近更新 更多