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 rootsettings,并将 Template Language 设置为 Django;但这并没有解决问题。


经过反复试验,我发现了一个奇怪的解决方案;如果我使用import osos.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')
]