Django集成富文本编辑器summernote的实现步骤


Posted in Python onMay 31, 2021

提到Django的富文本编辑器,大家一定会想到ckeditor和tinyMCE。其实还是有一个富文本编辑器同样优秀,它就是summernote,个人认为功能上不逊于ckeditor,比tinyMCE更强大。Summernote 是一个简单灵活的所见即所得的 HTML 富文本编辑器,基于 jQuery 和 Bootstrap 构建,支持图片上传,提供了大量可定制的选项。

展示效果如下所示:

Django集成富文本编辑器summernote的实现步骤

第一步 安装django-summernote

首先通过pip安装django-summernote,建议安装在Django项目所在的虚拟环境里。如果你要上传图片,还需要安装pillow这个图片库。

pip install django-summernote
pip install pillow # 上传图片时需要

接着将其加入到INSTALLED_APPS里去,如下所示:

INSTALLED_APPS = [
    ...
    'django_summernote', # 注意下划线
]

然后将django_summernote.urls 加入到项目的 urls.py

from django.urls import include
# ...
urlpatterns = [
    ...
    path('summernote/', include('django_summernote.urls')),
    ...
]

如果你需要上传图片,还需要在settings.py中设置MEDIA相关选项,如下所示。如果你Django的版本是3.x的,你还需设置X_FRAME_OPTIONS选项。

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')

# Django 3.X用户还需增加如下配置
X_FRAME_OPTIONS = 'SAMEORIGIN'

如果你在本地开发测试环境debug=True, 你还需要使用django自带static静态文件服务器才能正确显示上传的图片。修改项目的urls.py, 添加如下代码:

from django.conf import settings
from django.conf.urls.static import static

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

第二步 使用django-summernote

你可以在Django自带管理后台admin中使用django-summernote, 也可以在自己的表单中使用django-summernote。

admin中使用

from django_summernote.admin import SummernoteModelAdmin
from .models import Post

class PostAdmin(SummernoteModelAdmin):
    summernote_fields = ('content',)

admin.site.register(Post, PostAdmin)

展示效果如下所示:

Django集成富文本编辑器summernote的实现步骤

表单中使用

如果你使用普通表单,只需要设置富文本显示字段的widget即可,如下所示:

from django_summernote.widgets import SummernoteWidget, SummernoteInplaceWidget

# Apply summernote to specific fields.
class PostForm(forms.Form):
    content = forms.CharField(widget=SummernoteWidget())  # instead of forms.Textarea

# 如果你已使用django-crispy-forms, 请使用
class PostForm(forms.Form):
    content = forms.CharField(widget=SummernoteInplaceWidget())

如果你使用ModelForm, 可以通过如下方式设置widget。

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        widgets = {
            'content': SummernoteWidget(),
        }

注意:通过表单提交的内容都是带html标签的,需正确显示文本,需要使用safe模板标签。

{{ content|safe }}
由于SummernoteWidget对用户提交的数据不做任何转义,所以存在外部用户通过表单注入恶意脚本的风险,小编并不建议使用。在表单中使用django-summernote更好的方式是使用SummernoteTextFormField和SummernoteTextField,它们会对所有有害的标签进行转义。使用方式如下所示:

第三步 测试效果

Djangos-summernote不仅可以上传图片,还可以嵌入视频哦,亲测成功!

Django集成富文本编辑器summernote的实现步骤

第四步 常规配置

常用设置选项如下所示,可以满足大部分项目需求,可以直接copy使用。

SUMMERNOTE_CONFIG = {
    'iframe': True,
    # 如果你本身已使用Bootstrap/jQuery主题
    # 'iframe': False,
    'summernote': {
        # As an example, using Summernote Air-mode
        'airMode': False,
        
        # 编辑窗口 size
        'width': '100%',
        'height': '450',

        # 语言设置
        'lang': None,

        # 工具栏图标
        # https://summernote.org/deep-dive/#custom-toolbar-popover
        'toolbar': [
            ['style', ['style',]],
            ['font', ['bold', 'underline', 'clear']],
            ['fontname', ['fontname']],
            ['fontsize', ['fontsize']],
            ['color', ['color']],
            ['para', ['ul', 'ol', 'paragraph']],
            ['table', ['table']],
            ['insert', ['link', 'picture', 'video']],
            ['view', ['redo', 'undo', 'fullscreen', 'codeview',]],
        ],
    },

    # 上传图片需要用户先登录.
    'attachment_require_authentication': True,

    # Set `upload_to` function for attachments.
    # 'attachment_upload_to': my_custom_upload_to_func(),

    # Set custom storage class for attachments.
    # 'attachment_storage_class': 'my.custom.storage.class.name',
    
    # You can completely disable the attachment feature.
    'disable_attachment': False,
    
    # Set to `True` to return attachment paths in absolute URIs.
    'attachment_absolute_uri': False,
    
    # test_func in summernote upload view. (Allow upload images only when user passes the test)
    # https://docs.djangoproject.com/en/2.2/topics/auth/default/#django.contrib.auth.mixins.UserPassesTestMixin
    # ```
    # def example_test_func(request):
    #     return request.user.groups.filter(name='group_name').exists()
    # ```
    # 'test_func_upload_view': example_test_func,
    
    # 懒加载
    'lazy': True,
}

以上就是Django集成富文本编辑器summernote的实现步骤的详细内容,更多关于Django集成富文本编辑器summernote的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python插入排序算法的实现代码
Nov 21 Python
Tensorflow简单验证码识别应用
May 25 Python
python中的字符串内部换行方法
Jul 19 Python
python+opencv+caffe+摄像头做目标检测的实例代码
Aug 03 Python
使用 Python 实现简单的 switch/case 语句的方法
Sep 17 Python
浅谈python3中input输入的使用
Aug 02 Python
使用selenium和pyquery爬取京东商品列表过程解析
Aug 15 Python
python shutil文件操作工具使用实例分析
Dec 25 Python
Python基于time模块表示时间常用方法
Jun 18 Python
python 基于opencv实现图像增强
Dec 23 Python
Python使用openpyxl复制整张sheet
Mar 24 Python
Python 绘制多因子柱状图
May 11 Python
Python基础知识学习之类的继承
May 31 #Python
Django实现聊天机器人
Python趣味挑战之教你用pygame画进度条
Python趣味挑战之用pygame实现简单的金币旋转效果
May 31 #Python
解决pytorch读取自制数据集出现过的问题
Python爬虫基础初探selenium
只用40行Python代码就能写出pdf转word小工具
You might like
自制汽车收音机天线:收听广播的技巧和方法
2021/03/02 无线电
php异常处理技术,顶级异常处理器
2012/06/13 PHP
PHP中判断变量为空的几种方法小结
2013/11/12 PHP
php简单实现发送带附件的邮件
2015/06/10 PHP
Yii模型操作之criteria查找数据库的方法
2016/07/15 PHP
PHP Oauth授权和本地加密实现方法
2016/08/12 PHP
理清PHP在Linxu下执行时的文件权限方法
2017/06/07 PHP
PHP基于自定义函数实现的汉字转拼音功能实例
2017/09/30 PHP
JavaScript 加号(+)运算符号
2009/12/06 Javascript
JS target与currentTarget区别说明
2011/08/28 Javascript
通过JS获取用户本地图片路径并显示的代码
2012/02/16 Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
2013/01/17 Javascript
$("").click与onclick的区别示例介绍
2014/09/25 Javascript
thinkphp实现无限分类(使用递归)
2015/12/19 Javascript
JS自动生成动态HTML验证码页面
2017/06/14 Javascript
通过实践编写优雅的JavaScript代码
2019/05/30 Javascript
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
2020/02/12 Javascript
Nuxt pages下不同的页面对应layout下的页面布局操作
2020/11/05 Javascript
Python中的类学习笔记
2014/09/23 Python
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
Python批量创建迅雷任务及创建多个文件
2016/02/13 Python
python中安装模块包版本冲突问题的解决
2017/05/02 Python
Python编程把二叉树打印成多行代码
2018/01/04 Python
对Python多线程读写文件加锁的实例详解
2019/01/14 Python
解决Jupyter因卸载重装导致的问题修复
2020/04/10 Python
python 实现朴素贝叶斯算法的示例
2020/09/30 Python
Python Pandas list列表数据列拆分成多行的方法实现
2020/12/14 Python
AMAVII眼镜官网:时尚和设计师太阳镜
2019/05/05 全球购物
安全标准化实施方案
2014/02/20 职场文书
出纳员岗位职责风险
2014/03/06 职场文书
让生命充满爱演讲稿
2014/05/10 职场文书
“四风”查摆问题自我剖析材料
2014/09/27 职场文书
《秋思》教学反思
2016/02/23 职场文书
详解RedisTemplate下Redis分布式锁引发的系列问题
2021/04/27 Redis
redis哨兵常用命令和监控示例详解
2021/05/27 Redis
Beekeeper Studio开源数据库管理工具比Navicat更炫酷
2022/06/21 数据库