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标准库中的wave模块绘制乐谱的简单教程
Mar 30 Python
Python实现获取命令行输出结果的方法
Jun 10 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
Nov 23 Python
Python实现对一个函数应用多个装饰器的方法示例
Feb 09 Python
python数字图像处理之高级形态学处理
Apr 27 Python
pygame游戏之旅 python和pygame安装教程
Nov 20 Python
python版飞机大战代码分享
Nov 20 Python
python 读取Linux服务器上的文件方法
Dec 27 Python
解决Python3 抓取微信账单信息问题
Jul 19 Python
django的ORM操作 删除和编辑实现详解
Jul 24 Python
虚拟环境及venv和virtualenv的区别说明
Feb 05 Python
Python如何加载模型并查看网络
Jul 15 Python
Python基础知识学习之类的继承
May 31 #Python
Django实现聊天机器人
Python趣味挑战之教你用pygame画进度条
Python趣味挑战之用pygame实现简单的金币旋转效果
May 31 #Python
解决pytorch读取自制数据集出现过的问题
Python爬虫基础初探selenium
只用40行Python代码就能写出pdf转word小工具
You might like
PHP中调用ASP.NET的WebService的代码
2011/04/22 PHP
PHP扩展框架之Yaf框架的安装与使用
2016/05/18 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
2018/06/19 PHP
php面向对象程序设计中self与static的区别分析
2019/05/21 PHP
js 中 document.createEvent的用法
2010/08/29 Javascript
jquery必须知道的一些常用特效方法及使用示例(整理)
2013/06/24 Javascript
js实现简单的星级选择器提交效果适用于评论等
2013/10/18 Javascript
javascript模拟地球旋转效果代码实例
2013/12/02 Javascript
用JS在浏览器中创建下载文件
2014/03/05 Javascript
使用JavaScript获取地址栏参数的方法
2014/12/19 Javascript
javascript实现动态表头及表列的展现方法
2015/07/14 Javascript
利用jQuery及AJAX技术定时更新GridView的某一列数据
2015/12/04 Javascript
基于JavaScript创建动态Dom
2015/12/08 Javascript
jQuery取得iframe中元素的常用方法详解
2016/01/14 Javascript
简单实现js倒计时功能
2017/02/13 Javascript
JS实现图片预览的两种方式
2017/06/27 Javascript
webpack4.0打包优化策略整理小结
2018/03/30 Javascript
JS中的两种数据类型及实现引用类型的深拷贝的方法
2018/08/12 Javascript
JS中appendChild追加子节点无效的解决方法
2018/10/14 Javascript
jQuery实现简单三级联动效果
2020/09/05 jQuery
[01:01:13]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第三场
2018/04/06 DOTA
python调用xlsxwriter创建xlsx的方法
2018/05/03 Python
使用python进行文本预处理和提取特征的实例
2018/06/05 Python
python set内置函数的具体使用
2019/07/02 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
2020/01/18 Python
如何教少儿学习Python编程
2020/07/10 Python
python BeautifulSoup库的安装与使用
2020/12/17 Python
德国受欢迎的旅游和休闲网站:lastminute.de
2019/09/23 全球购物
客服实习的个人自我鉴定
2013/10/20 职场文书
临床医师个人自我评价
2014/04/06 职场文书
简单租房协议书(范本)
2014/10/13 职场文书
2015年生产部工作总结范文
2015/05/25 职场文书
深入理解python多线程编程
2021/04/18 Python
JS异步堆栈追踪之为什么await胜过Promise
2021/04/28 Javascript
用Python仅20行代码编写一个简单的端口扫描器
2022/04/08 Python
nginx配置之并发频次限制
2022/04/18 Servers