我正在尝试设置一个包含公共应用程序(projectA)的项目,以便由其他几个Django项目共享(为了这个问题,projectB)。我有一个目录结构,如:
/ django的/了projectA / django的/项目B
我更新了PYTHONPATH以包含“/ django”,我可以从python shell中的projectA和projectB导入文件。
以前一切都在projectB中,但它确实有效,但现在我正在创建projectC。 projectC需要很多与projectB相同的功能,因此打破常用代码似乎很有用。以防我后来写其他项目。
我使用以下方法从应用程序导入URL取得了一些成功:
urlpatterns = patterns('',
...
(r'^appname/', include('common.appname.urls')),
...
)
但我无法导入任何文件。例如,我写了一个新的zipcode表单字段:
from django.forms.fields import CharField
from django.utils.translation import ugettext_lazy as _
from contrib.core import validators
class ZipcodeField(CharField):
default_error_messages = {
'invalid': _(u'Enter a valid zipcode.'),
}
default_validators = [validators.validate_zipcode]
位于:
的django /了projectA /形式/ forms.py
当我尝试将它包含在projectB中时,我收到一个未定义的错误:
'module'对象没有属性'forms' 要么 “name'projectA'未定义”
取决于我如何尝试包含它。
有人可以帮我理解我做错了什么以及我应该如何在项目之间共享代码。我真的很想遵循DRY编码惯例。
感谢 -matt
答案 0 :(得分:0)
我猜你错过了__init__.py
个文件。这些向python表明给定的文件夹是包含可导入代码的模块。它们不必包含任何内容,只需在右侧文件夹中运行touch __init__.py
即可,或者您可以使用该名称保存空白文本文件。
如果我创建以下目录结构:
projects/
__init__.py
projectA/
__init__.py
forms/
forms.py
projectB/
__init__.py
forms/
forms.py
然后我可以执行以下python导入:
from projects.projectB.forms.forms import MyClass
from projects.projectB.forms.forms import AnotherClass
两个forms.py文件显然包含MyClass和AnotherClass定义。
另外,我建议您使用“django”以外的名称作为顶级文件夹。 django框架的实际代码也在一个名为“django”的模块中。
关于你的DRY问题,我会将公共代码移动到项目中的第三个目录/称为“shared_apps”之类的东西。