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中List.index()方法的使用教程
May 20 Python
Python正则表达式使用经典实例
Jun 21 Python
Python内置函数delattr的具体用法
Nov 23 Python
Python并发编程协程(Coroutine)之Gevent详解
Dec 27 Python
Jupyter notebook远程访问服务器的方法
May 24 Python
Python中应该使用%还是format来格式化字符串
Sep 25 Python
Django框架教程之中间件MiddleWare浅析
Dec 29 Python
Python urlopen()和urlretrieve()用法解析
Jan 07 Python
python实现滑雪游戏
Feb 22 Python
如何基于Python和Flask编写Prometheus监控
Nov 25 Python
Python实现钉钉/企业微信自动打卡的示例代码
Feb 02 Python
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
Jun 22 Python
Python基础知识学习之类的继承
May 31 #Python
Django实现聊天机器人
Python趣味挑战之教你用pygame画进度条
Python趣味挑战之用pygame实现简单的金币旋转效果
May 31 #Python
解决pytorch读取自制数据集出现过的问题
Python爬虫基础初探selenium
只用40行Python代码就能写出pdf转word小工具
You might like
别人整理的服务器变量:$_SERVER
2006/10/20 PHP
解析php中session的实现原理以及大网站应用应注意的问题
2013/06/17 PHP
JavaScript之Getters和Setters 平台支持等详细介绍
2012/12/07 Javascript
在表单提交前进行验证的几种方式整理
2013/07/31 Javascript
jQuery中ajax的使用与缓存问题的解决方法
2013/12/19 Javascript
页面装载js及性能分析方法介绍
2014/03/21 Javascript
JavaScript中的函数重载深入理解
2014/08/04 Javascript
28个常用JavaScript方法集锦
2015/01/14 Javascript
JS简单实现多级Select联动菜单效果代码
2015/09/06 Javascript
js实现新浪微博首页效果
2015/10/16 Javascript
jquery实现的动态回到顶部特效代码
2015/10/28 Javascript
js实现商品抛物线加入购物车特效
2020/11/18 Javascript
JavaScript常用判断写法大全(推荐)
2016/05/30 Javascript
浅谈String.valueOf()方法的使用
2016/06/06 Javascript
JavaScript中Form表单技术汇总(推荐)
2016/06/26 Javascript
Vue.js开发环境搭建
2016/11/10 Javascript
Nodejs进阶:如何将图片转成datauri嵌入到网页中去实例
2016/11/21 NodeJs
原生js中ajax访问的实例详解
2017/09/19 Javascript
利用jqprint插件打印页面内容的实现方法
2018/01/09 Javascript
bootstrap中日历范围选择插件daterangepicker的使用详解
2018/04/17 Javascript
Angular路由ui-router配置详解
2018/08/01 Javascript
浅析Vue 防抖与节流的使用
2019/11/14 Javascript
jQuery与原生JavaScript选择HTML元素集合用法对比分析
2019/11/26 jQuery
package.json各个属性说明详解
2020/03/11 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
详解Django框架中的视图级缓存
2015/07/23 Python
Python中selenium实现文件上传所有方法整理总结
2017/04/01 Python
python使用pil库实现图片合成实例代码
2018/01/20 Python
Python实现简单的2048小游戏
2021/03/01 Python
凯蒂·佩里个人女鞋品牌:Katy Perry Collections
2019/04/04 全球购物
编码实现字符串转整型的函数
2012/06/02 面试题
鲜果饮品店创业计划书
2014/01/21 职场文书
初三开学计划书
2014/04/27 职场文书
全国法制宣传日活动总结
2015/05/05 职场文书
优秀范文:读《红岩》有感3篇
2019/10/14 职场文书
Python爬虫之爬取最新更新的小说网站
2021/05/06 Python