django Pycharm 2020.2.2在使用“ pathlib.Path”寻址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中,我将静态文件设置定义为:

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

感谢您的帮助。

解决方法

这是PyCharm的已知局限性,您可以看到这个已有6年历史的错误报告:https://youtrack.jetbrains.com/issue/PY-13911。其他用户也有相同的问题,例如:https://youtrack.jetbrains.com/issue/PY-45244

这是推荐的解决方案:

请考虑将public static void getFileFromURL(final Context context,final Uri uri) { ContentResolver contentResolver = context.getContentResolver(); try { String mimeType = contentResolver.getType(uri); Cursor returnCursor = contentResolver.query(uri,null,null); int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); returnCursor.moveToFirst(); String fileName = returnCursor.getString(nameIndex); InputStream inputStream = contentResolver.openInputStream(uri); // get private downlaoad dir for Android 10 File downloadDir = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS); File f = new File(downloadDir + "/" + fileName); FileOutputStream out = new FileOutputStream(f); IOUtils.copyStream(inputStream,out); ..... // then whatever you need with the file f }catch (Exception e){ e.printStackTrace(); } 用于os.path。 (...)

我将https://github.com/pydanny/cookiecutter-django用于我的项目,该项目在设置中使用BASE_DIR。甚至Django官方文档也使用pathlib

这就是为什么我在pathlib中使用此hack以便PyCharm可以自动完成并且可以使用settings的原因:

pathlib

Django staticfiles autocomplete

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...