为啥我的上传目录相对于项目目录,但 Django 试图从与应用程序相关的路径中获取它?

Posted

技术标签:

【中文标题】为啥我的上传目录相对于项目目录,但 Django 试图从与应用程序相关的路径中获取它?【英文标题】:Why is my upload directory relative to the project directory but Django is trying to get it from an app related path?为什么我的上传目录相对于项目目录,但 Django 试图从与应用程序相关的路径中获取它? 【发布时间】:2021-11-13 19:01:00 【问题描述】:

我正在构建一个开发博客来存储和引用我为我的作品集编写的项目,并且我一直在尝试将媒体上传功能添加到我的帖子文本框中。我开始使用标准的 RichTextField,它具有通过 URL 添加图像的内置功能(不上传)。 它运行良好,但我希望能够从我的机器上传照片。

博客是完全可操作的(在本地服务器上进行开发),所以所有不相关的代码都被忽略了。

唯一的问题是设置我的图像文件的路径。

models.py

从 django.db 导入模型 从 django.utils 导入时区 从 django.urls 导入反向 从 ckeditor_uploader.fields 导入 RichTextUploadingField 类帖子(模型。模型): 作者=models.ForeignKey('auth.User',on_delete=models.CASCADE) 标题= models.CharField(max_length=40) 文本 = RichTextUploadingField() create_date = models.DateTimeField(default=timezone.now()) Publication_date = models.DateTimeField(空白=真,空=真) def 发布(自我): self.publication_date=timezone.now() 自我保存() def 批准评论(自我): 返回 self.cmets.filter(approved_comment=True) def __str__(self): 返回self.title def get_absolute_url(self): 返回反向('post_detail',kwargs='pk':self.pk) def ckeditor_upload(self): 返回反向('post_detail',kwargs='pk':self.pk)

urls.py

从 django.contrib 导入管理员 从 django.urls 导入路径,包括,re_path 从 django.contrib.auth 导入视图 网址模式 = [ 路径('admin/',admin.site.urls), 路径('',包括('blog.urls')), path('accounts/login/',views.LoginView.as_view(template_name='registration/login.html'),name='login'), path('accounts/logout/',views.LogoutView.as_view(),name='logout',kwargs='next_page':'/'), #'next_page':'/' 让它返回到主页 re_path(r'^ckeditor/', 包括('ckeditor_uploader.urls')), ]
**settings.py**
<pre>

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'ckeditor',
    'ckeditor_uploader',
    'blog'
]

#
#
#

CKEDITOR_UPLOAD_PATH = 'media/uploads'
The file is being uploaded to a new media directory in the project folder, but it is trying to load it from within the app folder. 
<pre>
[20/Sep/2021 02:58:14] "POST /ckeditor/upload/ HTTP/1.1" 200 86
Not Found: /media/uploads/2021/09/20/kaki.jpg
[20/Sep/2021 02:58:14] "GET /media/uploads/2021/09/20/kaki.jpg HTTP/1.1" 404 4602
Not Found: /media/uploads/2021/09/20/kaki.jpg
[20/Sep/2021 02:58:14,942] - Broken pipe from ('127.0.0.1', 54571)

我的尝试:

CKEDITOR_UPLOAD_PATH = 'blog/media/uploads' - 结果相同,但在 blog(app) 文件夹中。 手动将图像文件移动到应用程序媒体目录 - 图像已加载,但这有点毫无意义 添加根变量
MEDIA_URL='/媒体/'
MEDIA_ROOT=os.path.join(BASE_DIR,'博客/媒体')
CKEDITOR_UPLOAD_PATH = '上传'
- 相同的错误
[20/Sep/2021 03:34:48] “POST /ckeditor/upload/HTTP/1.1”200 95
未找到:/blog/media/uploads/2021/09/20/linkdn.jpg
[20/Sep/2021 03:34:48]“GET /blog/media/uploads/2021/09/20/linkdn.jpg HTTP/1.1”404 4623
未找到:/blog/media/uploads/2021/09/20/linkdn.jpg
[20/Sep/2021 03:34:48]“GET /blog/media/uploads/2021/09/20/linkdn.jpg HTTP/1.1”404 4623
尝试查看文档 将 CKEDITOR_UPLOAD_PATH 设置添加到项目的 settings.py 文件中。此设置指定 CKEditor 媒体上传目录的相对路径。 CKEditor 使用 Django 的存储 API。默认情况下,Django 使用文件系统存储后端(它将使用您的 MEDIA_ROOT 和 MEDIA_URL),如果您不使用不同的后端,您必须对 MEDIA_ROOT 中的 CKEDITOR_UPLOAD_PATH 路径具有写入权限,即: CKEDITOR_UPLOAD_PATH = "上传/" 使用默认文件系统存储时,图像将上传到您的 MEDIA_ROOT 中的“uploads”文件夹,并将针对 MEDIA_URL (/media/uploads/image.jpg) 创建 URL。 如果您希望能够控制文件名生成,则必须将自定义文件名生成器添加到您的设置中: - 没有任何效果。 尝试上传到静态文件 - 弄得一团糟。

指导性问题:

如果CKEDITOR_UPLOAD_PATH是上传路径,我可以指定加载路径,还是留下MEDIA ROOT

我有控制加载路径的默认值吗?

是否有其他更适合的富文本和上传框?

提前感谢任何提供帮助的人!

【问题讨论】:

【参考方案1】:

已解决

urlpatterns += static(settings.MEDIA_URL,  document_root=settings.MEDIA_ROOT) #Without this the MEDIA's URL is not recognized!!!

未添加到 URL,因此无法在表单请求时识别该 URL!

【讨论】:

以上是关于为啥我的上传目录相对于项目目录,但 Django 试图从与应用程序相关的路径中获取它?的主要内容,如果未能解决你的问题,请参考以下文章

uwsgi部署django项目—报内部错误

为啥django这样设置就能实现把所有app放到同一个目录?

为啥我的部署目录不断变化

Django 1.6 图片上传和媒体路径

为啥Makefile找不到包含目录

Webpack + Babel:找不到相对于目录的预设“es2015”