Django: Как сообщить Django, где искать приложения? - PullRequest
0 голосов
/ 16 мая 2018

После прочтения Two Scoops of Django 1.11 я изменил структуру своего проекта следующим образом:

myname_project
  ├── config/
  │   ├── settings/
  │   │   ├── base.py
  │   │   ├── local.py
  │   │   ├── staging.py
  │   │   ├── prod.py
  │   ├── __init__.py
  │   ├── urls.py
  │   └── wsgi.py
  ├── docs/
  ├── myname/
  │   ├── accounts/  # App
  │   ├── blog/ # App
  │   ├── core/ # App
  │   ├── media/ # Development only!
  │   ├── static/
  │   └── templates/
  ├── .gitignore
  ├── Makefile
  ├── README.md
  ├── manage.py
  └── requirements/

Моя проблема в том, что Django больше не находит приложение. Вот суть того, как выглядят мои файлы настроек:

import os
from pathlib import Path

from django.core.exceptions import ImproperlyConfigured


def get_env_variable(var_name):
    """Get the environment variable or return exception."""
    try:
        return os.environ[var_name]
    except KeyError:
        error_msg = 'Set the {} environment variable'.format(var_name)
        raise ImproperlyConfigured(error_msg)

# Build paths inside the project like this: BASE_DIR / 'media'
BASE_DIR = Path(__file__).resolve().parent.parent

PROJECT_ROOT = BASE_DIR.parent / 'myname'

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    ...
    'accounts',
    'blog',
    'core',
]

...

ROOT_URLCONF = 'config.urls'

...

Проблема теперь, когда я запускаю python manage.py makemigrations --settings=config.settings.local Я получаю ошибку: ModuleNotFoundError: No module named 'accounts'.

Так что Django, похоже, больше не может найти мои приложения. Как я могу сказать Django, в каком корневом каталоге он должен искать приложения?

Я пытался использовать PROJECT_ROOT = BASE_DIR.parent / 'myname', но это не помогло. И я не могу найти, как установить (псевдокод :) APP_DIR в Django документах.

1 Ответ

0 голосов
/ 16 мая 2018

Добавьте sys.path.append(os.path.join(BASE_DIR, "myname")) строку к вашему settings.py:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
sys.path.append(os.path.join(BASE_DIR, "myname"))

Или с pathlib:

BASE_DIR = Path(__file__).resolve().parent.parent
sys.path.append(str(BASE_DIR / 'myname'))
...