4

我有一个 Django 应用程序,它要求用户为每个文档上传多个图像。该应用程序已安装 django-ckeditor,但上传的图像最终位于设置设置的同一文件夹CKEDITOR_UPLOAD_PATH中。我希望路径是动态的,基于 URL 方案。

例如,上传到 CKEditor 实例的图像 https://myapp/report/1/finding/5应该位于 /ckeditor_base_path/report/1/finding/5/my_img.png.

不幸的是,处理设置路径的视图函数的 URL 是在视图创建参数之前由小部件 ( CKEditorUploadingWidget ) 设置的。context

我希望将参数 URL 参数发送到ImageUploadView进行处理。非常感谢您对此的任何帮助或建议。

4

2 回答 2

0

如果它对其他人有帮助,这就是我所做的。当用户浏览时,他们将被限制在包含查找图像的文件夹中,因为它们特定于报告的该部分。同样,上传图像会将其发送到同一文件夹。

简而言之,您必须:

  1. 将 CKEditor Uploader URL 指向您的视图版本
  2. 通过相应的表单视图更新 CKEditor Uploader 小部件
  3. 覆盖 CKEditor UploaderImageUploadViewbrowse视图以创建您想要的路径

例子

更新了 CKEditor URL 路径

path('myapp/<int:org_id>/report/<int:report_id>/finding/<int:finding_id>/image/upload', never_cache(ck_views.upload),
path('myapp/<int:org_id>/report/<int:report_id>/finding/<int:finding_id>/images', never_cache(ck_views.browse), name='ckeditor_browse'),

小部件更新

def get(self, request, *args, **kwargs):
        context = {}
        obj = self.get_object()
        if obj is not None:
            context['org'] = obj.report.org.id
            form = FindingForm(instance=obj)
            # Set image browse/upload path
            image_kwargs = {
                'finding_id': obj.id,
                'org_id': obj.report.org.id,
                'report_id': obj.report.id,
            }
            image_browse_path = reverse('ckeditor_browse', kwargs=image_kwargs)
            image_upload_path = reverse('ckeditor_upload', kwargs=image_kwargs)
            form.fields['description'].widget.config['filebrowserBrowseUrl'] = image_browse_path
            form.fields['description'].widget.config['filebrowserUploadUrl'] = image_upload_path
            context['form'] = form
        return render(request, self.template_name, context)
于 2018-09-02T01:40:14.307 回答
0

我遇到了同样的问题并查看了您的答案,但我认为有一个可能更简单的解决方案。

对于要执行的每个“唯一”上传操作,请在以下位置创建一个新配置settings.py

CKEDITOR_CONFIGS = {
    'action_a' : {
        'filebrowserUploadUrl': '/path/to/action/a/handling/view/'
    },
    'action_b' : {
        'filebrowserUploadUrl': '/path/to/action/b/handling/view/'
    }
}

创建表单时,将 的 设置config_nameCKEditorUploadingWidget所需的操作。

如果您不需要处理任何 URL 参数——比如在我的例子中,我只想将通过不同编辑器界面上传的文件放在不同的目录中——那么接下来的步骤相对简单。在相应的视图中处理并保存上传的文件。

但是,如果您确实需要基于 URL 参数执行操作,则可以检查request相应视图中的 以获取上传文件的页面:

referrer = request.META.get('HTTP_REFERER')

然后,您可以从所需的 URL 中提取参数(在您的情况下为报告 ID 和查找 ID),并使用它们上传到您想要的任何目录。

于 2020-08-14T11:25:01.340 回答