【问题标题】:How to use Django's include without a string literal?如何在没有字符串文字的情况下使用 Django 的包含?
【发布时间】:2020-04-15 16:37:18
【问题描述】:

我刚开始使用 django。

this tutorial 之后,我最终得到了以下urls.py

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]

这链接到polls.urls.py,它有自己的路由器。

我不喜欢的部分是字符串文字“polls.urls”,嗯……是字符串文字。

我想以某种方式使用 python 的某些功能直接引用该文件,并至少让我的 IDE 保护我。

如果我想移动那个polls.urls.py 文件,或者重命名它,或者重命名投票,会发生什么?我应该相信我的 IDE 能够从字符串文字中捕获引用吗?

这几乎就像在做this monstrosity,我很难接受这是最佳实践。

我觉得这很奇怪。


有没有办法在 django 的路由器中使用比字符串文字更不容易出错的东西?

【问题讨论】:

  • 您多久重命名一个应用程序,或者将应用程序的 urlconf 文件重命名为“urls.py”以外的其他文件?在您重命名应用程序的极少数情况下,您忘记相应地更新主 urlconf 的可能性有多大 - 特别是因为您会收到导入错误?哦,是的:动态导入不是一个怪物,当你需要它时,它们是一个非常有用的功能。
  • @brunodesthuilliers 我举了这个例子,但我在 django 的其他地方也看到了这种情况。我认为在可以是静态的地方进行动态导入是不好的。也许它们不能是静态的,但我真的不明白为什么会这样。
  • 当然你不应该在可以使用静态导入的地方使用动态导入,我们完全同意这一点。现在 Django 的初始化过程相当复杂(这是提供的所有功能的一部分),需要处理很多依赖项。在设置中(以及在主 urlconf 中)使用静态导入将使 Django 无法确保以正确的顺序导入所有内容。 Django 当然不是完美的,但它在全球范围内是一个设计和编写良好的软件,所以要确保这些选择有正当的理由。

标签: python django


【解决方案1】:

我没有看到使用字符串文字的问题,因为 URLconf 在启动服务器 (runserver) 之前加载

如果有问题你会得到 ModuleNotFound 错误

来自 include() 的来源:

if isinstance(urlconf_module, six.string_types):
    urlconf_module = import_module(urlconf_module)

您会通过 Django 框架和字符串文字看到大量的 import_module 用法。

您的 IDE 会知道是否有未解析的引用(Pycharm 会)

【讨论】:

    【解决方案2】:

    因此,据我了解或我所知,有两种使用 url 映射的方法 path' orurl`

    对于你必须做的事情的路径方法是:

    from django.urls import path, include

    但你也要导入你的views.py

    对于第二种方法,您要:

    from django.conf.urls import url

    那么您将在那里导入您的视图: from .views import home_page home_page 是你的views.py中的一个函数或类

    映射示例 url(r'^home/$', home_page),

    所以如果你使用这个方法就不需要实际创建 urls.py

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      • 2021-11-29
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      • 1970-01-01
      相关资源
      最近更新 更多