You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么Django上传目录设为项目根目录却从app路径查找CKEditor资源?

问题解答

  1. CKEDITOR_UPLOAD_PATH 与加载路径的关系
    CKEDITOR_UPLOAD_PATH仅为相对于MEDIA_ROOT的存储子路径,无法单独指定ckeditor上传资源的加载路径,所有媒体资源的访问路径都依赖Django全局的MEDIA_URL配置,最终访问路径为MEDIA_URL + CKEDITOR_UPLOAD_PATH + 自动生成的文件层级路径。
  2. 加载路径默认值规则
    不存在单独控制ckeditor资源加载路径的默认值,默认会复用Django全局的MEDIA_URL(默认值为空字符串)和MEDIA_ROOT(默认值为空)拼接路径,未显式配置这两个参数时就会出现路径拼接错误、资源404的问题。
  3. 替代富文本编辑器推荐
    除了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 05:36:03