这种情况发生在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中这样做。
如何彻底解决这种情况?
答案 0 :(得分:2)
这是错误的做法。
Django有一种方法可以将urls.py拆分成单独的文件,这就是使用include()
。将每个应用程序的URL保留在自己的urls.py中,并将它们包含在主要的URL中。
答案 1 :(得分:2)
对于那些找不到它的人,我遇到了模糊的导入错误。例如,在django项目中,假设我有这棵树:
在 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
未经测试,但我认为完全导入将按预期工作。