如何为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
相关产品推荐
相关产品推荐

