tags:

views:

24

answers:

1

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

A: 

I would guess that you are missing the __init__.py files. These indicate to python that a given folder is module which contains importable code. They don't have to contain anything, just running touch __init__.py in the right folder would be sufficient, or you can save a blank text file using that name.

If I create the following directory structure:

projects/
    __init__.py
    projectA/
        __init__.py
        forms/
            forms.py
    projectB/
        __init__.py
        forms/
            forms.py

Then I can execute the following python imports:

from projects.projectB.forms.forms import MyClass
from projects.projectB.forms.forms import AnotherClass

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".

AndrewF
Thanks Andrew. I figured it out.
matt snider