Django settings.py文件中BASE_DIR的定义为:
BASE_DIR = Path(__file__).resolve().parent.parent
__file__
代表的是settings.py文件,那么Path(__file__).resolve()
的结果将会是settings.py文件的绝对路径;然后取其父目录的父目录,也就是django-admin创建项目之后的路径。
若移动了settings.py的位置,BASE_DIR将不再指向原项目根目录,需要重新定义BASE_DIR。
例如:
原Django项目的目录结构为:
test_project ├── LICENSE ├── main.py └── test_django # Django项目根目录 ├── db.sqlite3 ├── manage.py └── test_django ├── apps │ └── app1 │ ├── admin.py │ ├── apps.py │ ├── __init__.py │ ├── migrations │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ └── views.py ├── asgi.py ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py
settings.py的默认位置为 test_project/test_django/test_django/settings.py
BASE_DIR为 test_project/test_django/
现将settings.py移动至test_project/test_django/test_django/settings/settings.py
现Django项目的目录结构为:
test_project ├── LICENSE ├── main.py └── test_django # Django项目根目录 ├── db.sqlite3 ├── manage.py └── test_django ├── apps │ └── app1 │ ├── admin.py │ ├── apps.py │ ├── __init__.py │ ├── migrations │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ └── views.py ├── settings │ └── settings.py ├── asgi.py ├── __init__.py ├── urls.py └── wsgi.py
则BASE_DIR变为 test_project/test_django/test_django/
代码中根据BASE_DIR来生成的路径就都指向了错误的位置。
有两种:
根据上例
# 在settings.py中 BASE_DIR = Path(__file__).resolve().parent.parent.parent
此时,BASE_DIR就改为了原来的路径 test_project/test_django/