如何导入具有不明确名称的特定模块?

时间:2011-07-08 15:15:04

标签: python django module

这种情况发生在Django上下文中,但问题不在于Django特定。

我正在尝试将我的大urls.py拆分为更小且更易于管理的块(应用程序包括,第三方模块,搜索,管理,开发等)。因此,我现在使用urls.py目录而不是urls/urls/__init__.py包含如下代码:

import admin
urlpatterns += admin.urlpatterns

现在我遇到了第三方模块的问题。例如,我正在覆盖django-messages的一堆网址和视图,因此我将其全部放入urls/messages.py。事实证明,我无法导入django-messages'视图,因为

from messages.views import inbox

urls/messages.py内首先尝试从本地目录导入,找到messages模块,但无法导入messages.views,因为urls/messages/views.py显然不存在。我不想将我的模块重命名为urls.messages_urls之类的东西,但我还没有找到一种方法来明确地告诉Python导入“其他”messages.views。我也不想通过字符串指定我导入的视图,即使我可以在Django中这样做。

如何彻底解决这种情况?

3 个答案:

答案 0 :(得分:2)

这是错误的做法。

Django有一种方法可以将urls.py拆分成单独的文件,这就是使用include()。将每个应用程序的URL保留在自己的urls.py中,并将它们包含在主要的URL中。

答案 1 :(得分:2)

对于那些找不到它的人,我遇到了模糊的导入错误。例如,在django项目中,假设我有这棵树:

  • 税务模块
    • 模型模块
      • 初始化的.py
      • tax.py
      • foo.py

init .py中,我想导入tax.models.tax.Tax。 所以我写道:

from tax.models.tax import Tax

但是python没有找到正确的导入(它在tax.models中查找模型)并抛出

ImportError: No module named models

你确实明白这都是关于相对进口的。 python首先查看当前模块。如果导入的第一部分存在于当前模块中,则会失败。 这种行为已在Python 2.5中修复(并且可能已成为Python 3.0中的默认设置),您只需添加:

from __future__ import absolute_import
绝对进口之前

。 请查看Python 2.5 introduces absolute imports以获取更全面的信息。

答案 2 :(得分:1)

你试过了吗?

from django.contrib.messages.views import inbox

未经测试,但我认为完全导入将按预期工作。