0318-SPACE 0318-SPACE

Django中ckeditor的使用


作者: LLL 浏览量:705 阅读量:1 发布:2022年1月17日 21:39 更新:2022年7月11日 10:58 Django 插件 ckeditor 编辑文章 删除文章
预计阅读时长:2分50秒

CKEditor即大名鼎鼎的FCKeditor(文本编辑器),它终于在最近发布新版本了,与增加版本号不同,这次完全把它改名了,更名为CKeditor。这应该是和它的开发公司CKSource(波兰华沙的公司)的名字有关吧,该公司的另一个产品为CKFinder(一个Ajax文件管理器),这次可能为了保持一致,将FCK更改为CK,但是版本号继承了下来,为CKeditor3.0版。

有支持django的第三方插件django-ckeditor

我感觉对于博客系统这种内容型的网站来说,这个编辑器还是非常nice的~

先看一下效果图:

这个是我今天基本上花费了一整天才配置好的,在配置过程中还是踩了非常多的坑的,所以想写下这篇博客来记录我今天踩的坑,不过最后终于配置好还是比较欣慰的,打不倒我的只会使我更加强大嘿嘿

 

还是一步一步来:

1.安装:pip install django-ckeditor

 

2.添加到installed_app

 

可以看到我添加了两个:

'ckeditor',  
'ckeditor_uploader', #富文本中图片的上传

如果不需要在编辑器中上传图片,只需要添加第一个即可!但是它既然都提供了上传图片这个功能,何必不用呢?也正是这个上传图片的功能让我倒腾了半天!


3.定义form(这里使用的是可以上传图片的)

from django import forms
from ckeditor_uploader.widgets import CKEditorUploadingWidget
from app.models import Blog
class BlogForm(forms.ModelForm):

    content=forms.CharField(widget=CKEditorUploadingWidget(
        attrs={'class': 'ckeditor', 'name': 'content'}
    ),label='',required=True,)

    class Meta:
        model=Blog
        fields=['content']
      

4.配置url

+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)这个千万不能漏掉,不然会上传文件失败!

5.在settings中配置图片的上传路径

按照如上配置后,上传的图片会自动保存在项目根目录下的media目录中。

6.在admin中指定form

完成这到这步后,admin管理台上就可以正常显示富文本编辑器了!

admin控制台使用ckeditor的配置就完成了!这个相对来说还是比较简单的,但是对于一个博客系统来说,管理台一般只有管理员才能进行查看和编辑,如果普通的用户也需要编辑自己的博客,就需要另外编写一个页面!

 

定义一个一般用户能使用的富文本编辑器,并且能上传图片。

上面的步骤还是不变的。

按照正常的思路来,我只需要只需要使用模板语言将form嵌套在html中并且加上safe修饰词渲染成html就行了,所以正常步骤如下:

定义好模板后,使用locals读取上文出现的所有变量,方便到模板中直接引用。但是,现实总是和想法不一样,错误显示的图我就不截了。这里需要在需在html文件中额外引入ckeditor.js文件即可:

引入这个js文件后就可以正常显示了!

但是!但是!但是!就算这里form中使用的是CKEditorUploadingWidget,这里生成出来的编辑器中任然是无法上传图片的!!!所以只好问度娘了。。。

试了网上的n种方法后,终于找到了一个可行的方法!!(这其中的辛酸不说了。。。)

 

方法就是找打插件库中的config.js文件,在其中添加一个配置:config.filebrowserImageUploadUrl= "/ckeditor/upload/&responseType=json";

顾名思义这个就是配置图片的上传路径,我这里的图片的上传路径为:/ckeditor/upload/&responseType=json,其中ckeditor为你自己添加url时取的名字,其他的默认就行,&responseType=json这个属性千万不能掉,否则也会失败!

完成以上的配置后,我刷新页面,再次点击图片那个按钮时,它出现了!不错,上传图片的选项它出现了!!!流出来激动的泪水。。。

但是!但是!你以为这就完了!这个在本地的图片上传功能确实完成了!

当我把项目重新上传到服务器,收集静态文件,关闭项目,启动项目,这熟练的手法我就不说了,当我激动的点开编辑页面时,我人又傻了!不仅没有图片上传的按钮!就连富文本的框框都没了!!???打开控制台,果不其然有报错!

报错内容:Refused to execute script from 'xxxx' because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled.

我能有啥办法呢,再次去找度娘!

一顿操作后,没看到一个解决的方法。。。

 

根据我个人的推断,应该就是这个文件加载失败,但是反复查看文件的加载路径,没错呀!?按照正常来说,在注册的app中添加了ckeditor这个库后,在使用collectstatic命令时,django是会去收集该包下的static。可是这里的情况是没有收集到。。。

我还能有啥办法呢,暴力一点吧,直接把ckeditor的static中的所有内容拷贝到我自己的static中喽

 

最后,再次上传项目,重启项目,终于看到了那个富文本编辑框!

哎,这一天没有白费~ 

每天进步一点点嘿嘿~

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 


 {[collection_status]}  {[likes]}

有什么想对作者说的吗?

发 表
{[ comment.user.username]} {[comment.time]}
删除
{[comment.content]}
热文排行榜
日热榜 周热榜 月热榜

标签
golang 个人介绍 开发环境 最大之数组合 gui mro nginx 函数模板 清单 并发编程 小细节 matlab 图像处理 oracle python leetcode 多线程 c++ 人工智能 插入排序 seaborn 爬虫学习 动态规划 负载均衡 数学模型 虚拟环境 字符集 js 异常 面向对象 多态 异或 冒泡排序 循环语句 容器 Django 高级变量类型 数据库 单调栈 java基础 web aiohttp bug 基础 形态学操作 最短路径 闭包 桶排序 with tcp 数字图像 双指针 爬虫 算法 OpenCV 开发 开机自启 else 选择排序 装饰器 排序算法 HTM 数据处理 测试 二分法 c# python基础 存储异常 java 学生成绩管理系统 ER图 笔记 GUI编程 二叉树 序列 git 梯度计算 数据结构 多进程 table 建模 数据库编程 巩固 三数之和 实验报告 可视化 数据分析 可控自启 上下文管理器 生成器、迭代器 Linux 存储泄漏 角点检测 ip 数据类型 asyncio 动态 开发记录 协程 开发工具 numpy学习 特性 人脸检测 二叉排序树 整蛊 Web开发编程 面经 pygame 几何变换 html 数组 异步 有效单词数 十进制 内存管理 霍夫变换 飞机大战 drw restful 关于博主 penCV 可迭代对象 对象引用 Lcss pl css 基础爬虫框架 视频处理 插件 MSE 浅拷贝 迷宫求解 阶层 初学 图像去噪 层次遍历 defaultD 属性 边缘检测 暴力解法 生成器 回溯 优化更新 生成器函数 贪心算法 深浅拷贝 三元表达式 高阶函数 并查集 文件 最小生成树 z最短距离 os模块的学习 admin pytorch pyecharts 可达鸭 穷举法 模块 多继承 排序 无限弹窗 运算符重载 dfs CPUID 美赛 mysql cursor 函数 数据库原理 迭代器 安装 settings turtle dp yield from 基数排序 降维 绘图 线性回归 目标追踪 强类型 前端开发 pandas 小游戏 分布式 流程控制 文件目录指令 变量 ckeditor 数学建模 命令 对象 oracle基础 网络编程(书) 推导式 docker bfs 语法进阶 模板 反向传播 iter() crud 计数排序 drf 漫威 解析性 三次握手 归约函数 查询 目标跟踪 plt 深拷贝 hash表 图像直方图 题库链接 game Windows 网络编程 线索化 动态数组 复习 JavaScript 版本控制 存储过程 视频读写 脚本 二进制 性能 面向对象的特性 Haar特征 环境搭建 翻转 数据 正则表达式 静态资源 ARP 地址 集群 虚函数 定时任务 归并排序 numpy

推荐


留言
{[ message.user.username ]}({[ message.time ]})

{[ message.content ]}