Django:如何告诉 Django 它应该在哪里寻找应用程序?

Posted

技术标签:

【中文标题】Django:如何告诉 Django 它应该在哪里寻找应用程序?【英文标题】:Django: How to tell Django where it should look for apps? 【发布时间】:2018-10-26 03:31:14 【问题描述】:

在阅读了 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',但这没有帮助。而且我在 Django 文档中找不到如何设置(伪代码:) APP_DIR

【问题讨论】:

【参考方案1】:

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

或使用路径库:

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

【讨论】:

非常感谢!因为我使用了 Pathlib,所以这样做的方法是:# Tell Django where to look for the apps. sys.path.append(str(BASE_DIR.parent / 'ordersome')) 您可能想将其添加到您的答案中:) @J.Hesters 欢迎您!感谢 pathlib 的评论:)

以上是关于Django:如何告诉 Django 它应该在哪里寻找应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

我如何告诉 django-nose 我的测试在哪里?

django manager 代码应该在哪里?

如何在 Django 中创建多选框?

为啥 Django 试图打开一个我没有告诉它的 URL?

Django,TemplateDoesNotExist 错误:Heroku 找不到模板目录。如何显示它在哪里看?

如何在 django 模板中设置自定义 forloop 起点