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写的Tkinter程序屏幕居中方法
Mar 10 Python
使用python实现省市三级菜单效果
Jan 20 Python
python Django批量导入不重复数据
Mar 25 Python
Python实现的文本对比报告生成工具示例
May 22 Python
Python实现调用另一个路径下py文件中的函数方法总结
Jun 07 Python
python实现电子产品商店
Feb 26 Python
django框架使用orm实现批量更新数据的方法
Jun 21 Python
利用Python绘制Jazz网络图的例子
Nov 21 Python
Python实现密码薄文件读写操作
Dec 16 Python
Django Serializer HiddenField隐藏字段实例
Mar 31 Python
解决Jupyter notebook中.py与.ipynb文件的import问题
Apr 21 Python
Python内置类型集合set和frozenset的使用详解
Apr 26 Python
Python基础知识学习之类的继承
May 31 #Python
Django实现聊天机器人
Python趣味挑战之教你用pygame画进度条
Python趣味挑战之用pygame实现简单的金币旋转效果
May 31 #Python
解决pytorch读取自制数据集出现过的问题
Python爬虫基础初探selenium
只用40行Python代码就能写出pdf转word小工具
You might like
php adodb介绍
2009/03/19 PHP
php记录代码执行时间(实现代码)
2013/07/05 PHP
php实现对文件压缩简单的方法
2019/09/29 PHP
php获取微信openid方法总结
2019/10/10 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
IE和FireFox(FF)中js和css的不同
2009/04/13 Javascript
一个可以随意添加多个序列的tag函数
2009/07/21 Javascript
jQuery获取CSS样式中的颜色值的问题,不同浏览器格式不同的解决办法
2013/05/13 Javascript
js的[defer]和[async]属性
2014/11/24 Javascript
JS限制文本框只能输入数字和字母方法
2015/02/28 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
JS仿淘宝实现的简单滑动门效果代码
2015/10/14 Javascript
详解Bootstrap的iCheck插件checkbox和radio
2016/08/24 Javascript
JavaScript每天必学之事件
2016/09/18 Javascript
收藏AngularJS中最重要的核心功能
2017/07/09 Javascript
JavaScript设计模式之责任链模式实例分析
2019/01/16 Javascript
Nodejs中的require函数的具体使用方法
2019/04/02 NodeJs
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
Python的print用法示例
2014/02/11 Python
浅析Python中将单词首字母大写的capitalize()方法
2015/05/18 Python
python实现超简单的视频对象提取功能
2018/06/04 Python
Python 数值区间处理_对interval 库的快速入门详解
2018/11/16 Python
Python爬虫之UserAgent的使用实例
2019/02/21 Python
Django如何防止定时任务并发浅析
2019/05/14 Python
Django对models里的objects的使用详解
2019/08/17 Python
Python数据可视化:箱线图多种库画法
2019/11/06 Python
检测tensorflow是否使用gpu进行计算的方式
2020/02/03 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
2020/03/30 Python
pandas将list数据拆分成行或列的实现
2020/12/13 Python
python 对xml解析的示例
2021/02/27 Python
日本语毕业生自荐信
2014/02/01 职场文书
2014年社区植树节活动方案
2014/02/28 职场文书
力学专业求职信
2014/07/23 职场文书
赔偿协议书范本
2014/09/12 职场文书
2014年大堂经理工作总结
2014/11/21 职场文书
nginx location中多个if里面proxy_pass的方法
2021/03/31 Servers