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

如何为django-ckeditor的媒体文件动态创建上传路径?

实现动态slug路径的CKEditor文件上传

1. 自定义CKEditor上传视图

在你的app的views.py中,编写一个处理上传的视图,从URL参数中获取三个slug,动态设置上传路径:

from django.conf import settings
from ckeditor.views import upload
import os

def custom_ckeditor_upload(request, p_slug, m_slug, slug):
    # 构造基于slug的相对上传路径(相对于media根目录)
    dynamic_path = os.path.join(p_slug, m_slug, slug)
    # 临时替换全局的CKEDITOR_UPLOAD_PATH
    original_path = settings.CKEDITOR_UPLOAD_PATH
    settings.CKEDITOR_UPLOAD_PATH = dynamic_path
    
    try:
        # 调用CKEditor原生的上传处理逻辑
        response = upload(request)
    finally:
        # 恢复原配置,避免影响其他请求
        settings.CKEDITOR_UPLOAD_PATH = original_path
    
    return response

2. 添加自定义上传URL路由

在项目的urls.py中,添加这个视图的路由,保持和编辑页面的路由结构对应:

path("<slug:p_slug>/<slug:m_slug>/<slug:slug>/ckeditor_upload/", views.custom_ckeditor_upload, name="custom_ckeditor_upload"),
# 原编辑页面路由保持不变
path("<slug:p_slug>/<slug:m_slug>/<slug:slug>/edit_feature/", views.EditFeature.as_view(), name="edit_feature"),

3. 修改模板中的CKEditor配置

在渲染编辑页面的模板里,初始化CKEditor时指定uploadUrl为自定义上传路由,并传入三个slug参数:

<script>
    CKEDITOR.replace('your-field-name', {
        uploadUrl: "{% url 'custom_ckeditor_upload' p_slug=parent_obj.slug m_slug=module_obj.slug slug=feature_obj.slug %}"
    });
</script>

注意替换your-field-name为表单中RichTextUploadingField对应的字段ID,同时根据视图传递到模板的实例对象,调整slug的取值变量(比如示例中的parent_obj、module_obj、feature_obj)。

4. 验证存储效果

完成配置后,上传的文件会自动存储到media/<p_slug>/<m_slug>/<slug>/目录下,符合预期路径要求。


内容的提问来源于stack exchange,提问作者dominz2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:15:35