I’m trying to setup a project that contains commons apps (projectA) to be shared by several other Django projects (projectB for the sake of this question). I have a directory structure like:
/django/projectA
/django/projectB
I have updated the PYTHONPATH to include “/django” and I can import files from both projectA and projectB in the python shell.
Everything used to be in projectB, and it worked, but now I’m creating projectC. The projectC needs a lot of the same functionality as projectB, so it seemed useful to break out common code. In case I later write other projects.
I have had some success importing URLs from the apps using:
urlpatterns = patterns('',
...
(r'^appname/', include('common.appname.urls')),
...
)
But I am unable to import any files. For example I have a new zipcode form field I wrote:
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]
located at:
django/projectA/forms/forms.py
When I try to include it in projectB, I get an error that it is undefined:
‘module’ object has no attribute ‘forms’
or
“name ‘projectA’ is not defined”
depending on how I try to include it.
Can someone please help me understand what I am doing wrong and how I am supposed to be sharing code between projects. I’d really like to follow the DRY coding conventions.
thanks
-matt
I would guess that you are missing the
__init__.pyfiles. These indicate to python that a given folder is module which contains importable code. They don’t have to contain anything, just runningtouch __init__.pyin the right folder would be sufficient, or you can save a blank text file using that name.If I create the following directory structure:
Then I can execute the following python imports:
The two forms.py files obviously contain MyClass and AnotherClass definitions.
Also, I would suggest you use a name other than “django” for your top level folder. The actual code for the django framework is also in a module called “django”.
As for your DRY question, I would move the common code into a third directory in projects/ called something like “shared_apps”.