为什么Django上传目录设为项目根目录却从app路径查找CKEditor资源?
问题解答
- CKEDITOR_UPLOAD_PATH 与加载路径的关系
CKEDITOR_UPLOAD_PATH仅为相对于MEDIA_ROOT的存储子路径,无法单独指定ckeditor上传资源的加载路径,所有媒体资源的访问路径都依赖Django全局的MEDIA_URL配置,最终访问路径为MEDIA_URL + CKEDITOR_UPLOAD_PATH + 自动生成的文件层级路径。 - 加载路径默认值规则
不存在单独控制ckeditor资源加载路径的默认值,默认会复用Django全局的MEDIA_URL(默认值为空字符串)和MEDIA_ROOT(默认值为空)拼接路径,未显式配置这两个参数时就会出现路径拼接错误、资源404的问题。 - 替代富文本编辑器推荐
除了ckeditor外,适配Django的上传功能富文本编辑器还有两个常用选项:
- django-tinymce:功能丰富度和ckeditor接近,配置逻辑类似
- django-markdownx:轻量化markdown编辑器,支持拖拽上传图片,适合偏好markdown写作的场景
两者的上传功能都依赖Django原生的MEDIA体系,配置逻辑一致。
修复方案
你的问题核心是Django本地开发模式默认不会提供媒体文件的访问路由,上传成功但访问404,按以下步骤修改即可:
步骤1:修正settings.py配置
# 确保settings.py开头已导入os import os # 以下配置放到settings.py末尾 MEDIA_URL = '/media/' # 媒体文件统一存储在项目根目录的media文件夹下,不要放在app内部 MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # ckeditor上传的文件存放在MEDIA_ROOT下的uploads子目录 CKEDITOR_UPLOAD_PATH = 'uploads/'
步骤2:添加本地媒体访问路由
修改项目根目录的urls.py,在路由列表末尾追加media路由规则:
from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # 你原有所有路由保持不变 path('admin/', admin.site.urls), path('',include('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':'/'}), re_path(r'^ckeditor/', include('ckeditor_uploader.urls')), # 仅本地开发模式生效,生产环境用Nginx等服务处理媒体文件 ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
修改完成后重启Django开发服务器,删除之前上传的旧文件重新上传即可正常访问。
内容的提问来源于stack exchange,提问作者Eyal Werber
相关产品推荐
相关产品推荐

