问题描述
我正在使用最新版本的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 root
和settings
,并将Template Language
设置为Django;但这并不能解决问题。
经过反复试验,我找到了一个奇怪的解决方案。如果我使用import os
和os.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