django Pycharm 2020.2.2 在使用 "pathlib.Path" 解决 BASE_DIR 时无法解析静态文件
django Pycharm 2020.2.2 not resolving static files when using "pathlib.Path" to address BASE_DIR
我使用的是最新版本的 Pycharm、2020.2.2 和 django 3.1.
在我的项目中,我删除了默认的 settings.py
并创建了一个名为 settings
的目录,因此整个项目根目录如下所示:
tsetmc
├── asgi.py
├── celery.py
├── context_processors.py
├── __init__.py
├── settings
│ ├── base.py
│ ├── __init__.py
│ ├── local.py
├── urls.py
├── views.py
└── wsgi.py
并且在 base.py
中,我将静态文件设置定义为:
<b>from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent.parent</b>
...
STATIC_URL = '/static/'
STATICFILES_DIRS = [
BASE_DIR / 'assets/'
]
STATIC_ROOT = BASE_DIR / 'staticfiles/'
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media/'
一切正常在浏览器中并且使用{% static %}
标签成功加载了静态文件;但是,Pycharm 无法解析模板中的任何静态文件。
我启用了 Django 支持,相应地在 Pycharm 设置中设置 Django project root
和 settings
,并将 Template Language
设置为 Django;但这并没有解决问题。
经过反复试验,我发现了一个奇怪的解决方案;如果我使用import os
和os.path.join()
来定位静态路径,而不是from pathlib import Path
和/
,Pycharm可以毫无问题地解析静态文件。
因此,当我将 base.py
更改为如下所示时:
<b>import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))</b>
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'assets')
]
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles/')
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
(使缓存失效后,不改变任何其他配置)
Pycahrm 可以完全解析静态文件。
我在这里遗漏了什么? 使用 Path
寻址静态文件有什么问题吗?或者问题出在 Pycharm 本身?
感谢您的帮助。
这是 PyCharm 的已知限制,您可以查看这个 6 年前的错误报告:https://youtrack.jetbrains.com/issue/PY-13911. Other users have the same problem, for example here: https://youtrack.jetbrains.com/issue/PY-45244。
这是推荐的解决方案:
Please consider using os.path
for BASE_DIR
. (...)
我对我的项目使用 https://github.com/pydanny/cookiecutter-django,它在设置中使用 pathlib
。甚至官方 Django 文档也使用 pathlib
.
这就是我在 settings
中使用此 hack 的原因,以便 PyCharm 可以自动完成并且我可以使用 pathlib
:
import os
from pathlib import Path
ROOT_DIR = Path(__file__).resolve(strict=True).parent.parent.parent
# my_project/
APPS_DIR = ROOT_DIR / "my_project"
# STATIC
# ------------------------------------------------------------------------------
# https://docs.djangoproject.com/en/dev/ref/settings/#static-root
STATIC_ROOT = str(ROOT_DIR / "staticfiles")
# https://docs.djangoproject.com/en/dev/ref/settings/#static-url
STATIC_URL = "/static/"
# https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#std:setting-STATICFILES_DIRS
STATICFILES_DIRS = [
str(APPS_DIR / "static"),
os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), 'my_project', 'static')
]
我使用的是最新版本的 Pycharm、2020.2.2 和 django 3.1.
在我的项目中,我删除了默认的 settings.py
并创建了一个名为 settings
的目录,因此整个项目根目录如下所示:
tsetmc
├── asgi.py
├── celery.py
├── context_processors.py
├── __init__.py
├── settings
│ ├── base.py
│ ├── __init__.py
│ ├── local.py
├── urls.py
├── views.py
└── wsgi.py
并且在 base.py
中,我将静态文件设置定义为:
<b>from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent.parent</b>
...
STATIC_URL = '/static/'
STATICFILES_DIRS = [
BASE_DIR / 'assets/'
]
STATIC_ROOT = BASE_DIR / 'staticfiles/'
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media/'
一切正常在浏览器中并且使用{% static %}
标签成功加载了静态文件;但是,Pycharm 无法解析模板中的任何静态文件。
我启用了 Django 支持,相应地在 Pycharm 设置中设置 Django project root
和 settings
,并将 Template Language
设置为 Django;但这并没有解决问题。
经过反复试验,我发现了一个奇怪的解决方案;如果我使用import os
和os.path.join()
来定位静态路径,而不是from pathlib import Path
和/
,Pycharm可以毫无问题地解析静态文件。
因此,当我将 base.py
更改为如下所示时:
<b>import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))</b>
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'assets')
]
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles/')
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
(使缓存失效后,不改变任何其他配置)
Pycahrm 可以完全解析静态文件。
我在这里遗漏了什么? 使用 Path
寻址静态文件有什么问题吗?或者问题出在 Pycharm 本身?
感谢您的帮助。
这是 PyCharm 的已知限制,您可以查看这个 6 年前的错误报告:https://youtrack.jetbrains.com/issue/PY-13911. Other users have the same problem, for example here: https://youtrack.jetbrains.com/issue/PY-45244。
这是推荐的解决方案:
Please consider using
os.path
forBASE_DIR
. (...)
我对我的项目使用 https://github.com/pydanny/cookiecutter-django,它在设置中使用 pathlib
。甚至官方 Django 文档也使用 pathlib
.
这就是我在 settings
中使用此 hack 的原因,以便 PyCharm 可以自动完成并且我可以使用 pathlib
:
import os
from pathlib import Path
ROOT_DIR = Path(__file__).resolve(strict=True).parent.parent.parent
# my_project/
APPS_DIR = ROOT_DIR / "my_project"
# STATIC
# ------------------------------------------------------------------------------
# https://docs.djangoproject.com/en/dev/ref/settings/#static-root
STATIC_ROOT = str(ROOT_DIR / "staticfiles")
# https://docs.djangoproject.com/en/dev/ref/settings/#static-url
STATIC_URL = "/static/"
# https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#std:setting-STATICFILES_DIRS
STATICFILES_DIRS = [
str(APPS_DIR / "static"),
os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), 'my_project', 'static')
]