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

如何为Django Admin的QuillField添加剪贴板模块,修复图文复制粘贴异常

Django QuillField 复制粘贴(含图片)问题解决方案

默认情况下,django-quill-editor 提供的 QuillField 仅支持基础富文本编辑,对包含图片的复制粘贴没有内置处理逻辑,需要通过以下额外配置来解决:

1. 配置Quill编辑器模块

在项目的 settings.py 中添加 QUILL_CONFIGS,启用剪贴板和图片上传支持:

import os
from django.conf import settings

QUILL_CONFIGS = {
    'default': {
        'theme': 'snow',
        'modules': {
            'toolbar': [
                ['bold', 'italic', 'underline', 'strike'],
                ['link', 'image'],
                ['clean']
                # 根据需求添加其他工具按钮
            ],
            'clipboard': {
                'matchVisual': False,  # 避免粘贴时格式错乱
                'allowed': ['html', 'image']  # 允许粘贴HTML和图片内容
            },
            'imageUploader': {
                'uploadUrl': '/quill/image-upload/'  # 指定图片上传接口
            }
        },
        'placeholder': '编辑文章内容...',
    }
}

# 确保媒体文件配置正确
MEDIA_ROOT = os.path.join(settings.BASE_DIR, 'media')
MEDIA_URL = '/media/'

2. 实现图片上传后端接口

添加路由

在项目的 urls.py 中添加图片上传的路由:

from django.urls import path
from django.views.decorators.csrf import csrf_exempt
from .views import quill_image_upload
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # 其他已有路由
    path('quill/image-upload/', csrf_exempt(quill_image_upload), name='quill_image_upload'),
]

# 开发环境下提供媒体文件访问
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

编写上传视图

在 views.py 中实现图片上传处理逻辑:

from django.http import JsonResponse
from django.core.files.storage import default_storage
from django.core.files.base import ContentFile
import os
from uuid import uuid4

def quill_image_upload(request):
    if request.method == 'POST' and request.FILES.get('image'):
        image_file = request.FILES['image']
        # 生成唯一文件名,避免重名
        file_ext = os.path.splitext(image_file.name)[1]
        filename = f"{uuid4().hex}{file_ext}"
        # 保存图片到媒体目录的quill_images子文件夹
        save_path = default_storage.save(f'quill_images/{filename}', ContentFile(image_file.read()))
        # 返回Quill编辑器要求的JSON格式
        return JsonResponse({'url': f'{settings.MEDIA_URL}{save_path}'})
    return JsonResponse({'error': '无效的请求或未上传图片'}, status=400)

3. 前端增强(可选)

如果使用自定义模板渲染Quill编辑器,可以添加前端代码,确保粘贴本地图片时能自动上传:

// 初始化Quill编辑器
var quill = new Quill('#id_article', {
    theme: 'snow',
    modules: {
        toolbar: [
            ['bold', 'italic', 'underline'],
            ['link', 'image']
        ],
        imageUploader: {
            uploadUrl: '/quill/image-upload/'
        }
    }
});

// 监听粘贴事件,处理本地图片
quill.root.addEventListener('paste', function(e) {
    const clipboardData = e.clipboardData || e.originalEvent?.clipboardData;
    if (!clipboardData) return;

    const items = clipboardData.items;
    for (let i = 0; i < items.length; i++) {
        if (items[i].type.startsWith('image/')) {
            e.preventDefault();
            const file = items[i].getAsFile();
            const formData = new FormData();
            formData.append('image', file);

            fetch('/quill/image-upload/', {
                method: 'POST',
                body: formData
            })
            .then(res => res.json())
            .then(data => {
                const range = quill.getSelection();
                quill.insertEmbed(range.index, 'image', data.url);
                quill.setSelection(range.index + 1);
            })
            .catch(err => console.error('图片上传失败:', err));
        }
    }
});

关键说明

  • 上述配置基于 django-quill-editor 包,确保你已经安装了该包:pip install django-quill-editor
  • 生产环境中,建议使用专业的存储服务替代本地媒体存储,并调整上传视图的存储逻辑
  • 若粘贴外部网页的图片,Quill默认会保留原URL,若需要本地化存储,需额外编写正则匹配图片URL并批量上传

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:45:03