【问题标题】:django Pycharm 2020.2.2 not resolving static files when using "pathlib.Path" to address BASE_DIRdjango Pycharm 2020.2.2 在使用“pathlib.Path”处理 BASE_DIR 时无法解析静态文件
【发布时间】:2020-09-23 21:46:48
【问题描述】:

我正在使用最新版本的 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 中,我将静态文件设置定义为:

from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent.parent

...

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 更改为如下所示时:

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))


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 本身?

感谢您的帮助。

【问题讨论】:

    标签: django pycharm django-staticfiles


    【解决方案1】:

    这是 PyCharm 的一个已知限制,您可以查看这个 6 年前的错误报告:https://youtrack.jetbrains.com/issue/PY-13911。其他用户也有同样的问题,例如这里:https://youtrack.jetbrains.com/issue/PY-45244

    这是推荐的解决方案:

    请考虑将os.path 用于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')
    ]
    

    【讨论】:

      猜你喜欢
      • 2017-06-28
      • 2018-06-05
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 2012-01-16
      • 2017-11-08
      • 1970-01-01
      • 2012-04-08
      相关资源
      最近更新 更多