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文本特征抽取与向量化算法学习
Dec 22 Python
pandas数据分组和聚合操作方法
Apr 11 Python
基于Pandas读取csv文件Error的总结
Jun 15 Python
python使用turtle库绘制树
Jun 25 Python
在Pycharm terminal中字体大小设置的方法
Jan 16 Python
python中将两组数据放在一起按照某一固定顺序shuffle的实例
Jul 15 Python
基于pygame实现童年掌机打砖块游戏
Feb 25 Python
Pycharm如何运行.py文件的方法步骤
Mar 03 Python
使用matplotlib的pyplot模块绘图的实现示例
Jul 12 Python
Python 远程开关机的方法
Nov 18 Python
用python批量移动文件
Jan 14 Python
Python中常见的反爬机制及其破解方法总结
Jun 10 Python
Python基础知识学习之类的继承
May 31 #Python
Django实现聊天机器人
Python趣味挑战之教你用pygame画进度条
Python趣味挑战之用pygame实现简单的金币旋转效果
May 31 #Python
解决pytorch读取自制数据集出现过的问题
Python爬虫基础初探selenium
只用40行Python代码就能写出pdf转word小工具
You might like
PHP网站备份程序代码分享
2011/06/10 PHP
php通过array_merge()函数合并两个数组的方法
2015/03/18 PHP
深入理解PHP中mt_rand()随机数的安全
2017/10/12 PHP
laravel 5.4 + vue + vux + element的环境搭配过程介绍
2018/04/26 PHP
php常用字符串查找函数strstr()与strpos()实例分析
2019/06/21 PHP
JavaScript页面模板库handlebars的简单用法
2015/03/02 Javascript
JS根据key值获取URL中的参数值及把URL的参数转换成json对象
2015/08/26 Javascript
js 动态给元素添加、移除事件的实现方法
2016/07/19 Javascript
jQuery编写textarea输入字数限制代码
2017/03/23 jQuery
JavaScript如何一次性展示几万条数据
2017/03/30 Javascript
推荐三款日期选择插件(My97DatePicker、jquery.datepicker、Mobiscroll)
2017/04/21 jQuery
使用vue-router设置每个页面的title方法
2018/02/11 Javascript
vue自定义全局共用函数详解
2018/09/18 Javascript
Three.js实现3D机房效果
2018/12/30 Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
2019/03/19 Javascript
JavaScript实现的弹出遮罩层特效经典示例【基于jQuery】
2019/07/10 jQuery
关于layui的动态图标不显示的解决方法
2019/09/04 Javascript
uploadify插件实现多个图片上传并预览
2019/09/30 Javascript
vue父子组件的通信方法(实例详解)
2019/11/10 Javascript
vuex入门最详细整理
2020/03/04 Javascript
Vue如何基于vue-i18n实现多国语言兼容
2020/07/17 Javascript
[50:48]LGD vs CHAOS 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
以Flask为例讲解Python的框架的使用方法
2015/04/29 Python
Python随手笔记之标准类型内建函数
2015/12/02 Python
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
2016/09/18 Python
Python PyCharm如何进行断点调试
2019/07/05 Python
python 画二维、三维点之间的线段实现方法
2019/07/07 Python
python中scipy.stats产生随机数实例讲解
2021/02/19 Python
h5页面背景图很长要有滚动条滑动效果的实现
2021/01/27 HTML / CSS
英国户外玩具儿童游乐设备网站:TP Toys(蹦床、攀爬框架、秋千、滑梯和游戏屋)
2018/04/09 全球购物
行政主管岗位职责
2015/02/03 职场文书
国富论读书笔记
2015/06/26 职场文书
七年级之家长会发言稿范文
2019/09/04 职场文书
python3 实现mysql数据库连接池的示例代码
2021/04/17 Python
React forwardRef的使用方法及注意点
2021/06/13 Javascript
mysql5.5中文乱码问题解决的有用方法
2022/05/30 MySQL