【Django】CKeditor富文本编辑器上传图片到FastDFS存储

因为在存储数据的时候可能会遇到存储信息并非纯文本的情况,比如说带有HTML语法,带有图片URL等,即富文本格式,也许我们需要使用富文本字段来存储具备丰富格式的文本

1.安装CKeditor与配置
pip install django-ckeditor

在配置文件 settings.py 添加应用

NSTALLED_APPS = [
    ...
    'ckeditor',  # 富文本编辑器
    'ckeditor_uploader',  # 富文本编辑器上传图片模块
    ...
]
...
# CKEditor相关配置
CKEDITOR_CONFIGS = {
    'default':{
        'toolbar':'full', # 使用工具条
        'height': 300, # 编辑高度
        # 'woidth': 300, # 编辑宽度
    },
}
CKEDITOR_UPLOAD_PATH = '' # 存储路径,因为我们使用了FastDFS,所以这里设置为空

设置总路由 urls.py

urlpatterns = [
    ...
    url(r'^ckeditor/', include('ckeditor_uploader.urls')),
]
2.修改模型类

根据我们的实际项目需要,修改模型相应的字段,设置为RichTextField (不支持文件)RichTextUploadingField(支持文件)

apps/goods/models.py

class Goods(BaseModel):
	...
	desc_detail = RichTextUploadingField(default='', verbose_name='详细介绍')

修改之后记得重新迁移才能生效

3.上传图片

我这里以上传图片为例。此项目使用的是FastDFS存储图片。关于FastDFS环境的搭建可以参考之前的笔记

【Django】使用FastDFS docker镜像存储图片和读取图片

我们新建一个只存储图片的模型类进行测试

apps/upload/models.py

class CommonImage(models.Model):
    image = models.ImageField(verbose_name="图片")
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')

    class Meta:
        db_table = "tb_commonImage"

    def __str__(self):
        return self.id

记得重新迁移数据库

apps/upload/views.py

from django.conf import settings
from django.shortcuts import redirect
from fdfs_client.client import Fdfs_client
from django.views import View
from django.http import HttpResponse

from .models import CommonImage

class ImageCommonView(View):
    def post(self,request):
        client = Fdfs_client(settings.FDFS_CLIENT_CONF)
        data = request.FILES.get('upload')
        callback = request.GET.get('CKEditorFuncNum')

        res = client.upload_by_buffer(data.read())
        if res['Status'] != 'Upload successed.':  # 如果上传失败
            return HttpResponse(status=403)
        image_url = res["Remote file_id"]  # 获取FastDFS返回的图片标识
        CommonImage.objects.create(image=image_url) # 存进数据库

        from_address = request.META['HTTP_REFERER']
        from_address = from_address[:from_address.rfind('/'):]
        # 返回重定向格式
        # http://192.168.203.153:8080/upload_success.html?image_url=http://192.168.203.153:8888/group1/M00/00/02/wKjLmV-Hr8eALcERAADYK4ex7Tc1786436&CKEditorFuncNum=1
        ret_url = from_address + '/upload_success.html?image_url=' + settings.FDFS_URL + image_url + '&CKEditorFuncNum=' + callback
        return redirect(ret_url)

不出意外的话应该是可以正常上传和显示图片的

在这里插入图片描述

顺便记录一个BUG

因为路径设置不正确(返回重定向的路径正常就不会有这个错误了),所以期间遇到了一个 in a frame because it set ‘X-Frame-Options’ to ‘SAMEORIGIN’ 的错误
Refused to display 'http://127.0.0.1:8000/upload/common/?CKEditor=editor2&CKEditorFuncNum=1&langCode=zh-cn' in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'.
解决方法是在对应的方法使用装饰器@xframe_options_exempt就可以解决了

from django.views.decorators.clickjacking import xframe_options_exempt
class ImageCommonView(View):
    @xframe_options_exempt
    def post(self,request):
    	...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰冷的希望

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值