Как Django импортирует приложения из проекта А в проект Б? - PullRequest
0 голосов
/ 22 сентября 2010

Я пытаюсь настроить проект, который содержит общие приложения (projectA) для совместного использования несколькими другими проектами Django (projectB ради этого вопроса). У меня есть структура каталогов, как:

/ Джанго / Projecta / Джанго / projectB

Я обновил PYTHONPATH, добавив в него "/ django", и я могу импортировать файлы как из projectA, так и из projectB в оболочке python.

Раньше все было в projectB, и это работало, но сейчас я создаю projectC. ProjectC нуждается во многом в той же функциональности, что и projectB, поэтому было бы полезно выделить общий код. Если я позже напишу другие проекты.

Я успешно импортировал URL-адреса из приложений, используя:

urlpatterns = patterns('',
    ...
    (r'^appname/', include('common.appname.urls')),
    ...
)

Но я не могу импортировать какие-либо файлы. Например, у меня есть новое поле формы почтового индекса, которое я написал:

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]

расположен по адресу:

Джанго / Projecta / формы / forms.py

Когда я пытаюсь включить его в projectB, я получаю сообщение об ошибке: undefined:

'модуль' объект не имеет атрибута 'формы' или же "имя 'projectA' не определено"

в зависимости от того, как я пытаюсь его включить.

Может кто-нибудь помочь мне понять, что я делаю неправильно и как я должен делиться кодом между проектами. Я бы очень хотел следовать правилам СУХОГО кодирования.

спасибо Матф

1 Ответ

0 голосов
/ 22 сентября 2010

Я предполагаю, что вам не хватает файлов __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".

Что касается вашего вопроса о СУХОЙ, я бы переместил общий код в третий каталог в проектах / называемый чем-то вроде "shared_apps".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...