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的迭代器、生成器以及相关的itertools包
Apr 02 Python
Python3字符串学习教程
Aug 20 Python
Python多进程库multiprocessing中进程池Pool类的使用详解
Nov 24 Python
使用python获取csv文本的某行或某列数据的实例
Apr 03 Python
python顺序的读取文件夹下名称有序的文件方法
Jul 11 Python
基于python代码实现简易滤除数字的方法
Jul 17 Python
在python中按照特定顺序访问字典的方法详解
Dec 14 Python
python里dict变成list实例方法
Jun 26 Python
Python pandas用法最全整理
Aug 04 Python
windows10在visual studio2019下配置使用openCV4.3.0
Jul 14 Python
Django路由层如何获取正确的url
Jul 15 Python
python超详细实现完整学生成绩管理系统
Mar 17 Python
Python基础知识学习之类的继承
May 31 #Python
Django实现聊天机器人
Python趣味挑战之教你用pygame画进度条
Python趣味挑战之用pygame实现简单的金币旋转效果
May 31 #Python
解决pytorch读取自制数据集出现过的问题
Python爬虫基础初探selenium
只用40行Python代码就能写出pdf转word小工具
You might like
十天学会php之第二天
2006/10/09 PHP
第十四节--命名空间
2006/11/16 PHP
php写入、删除与复制文件的方法
2015/06/20 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
JavaScript中void(0)的具体含义解释
2007/02/27 Javascript
获取网站跟路径的javascript代码(站点及虚拟目录)
2009/10/20 Javascript
突发奇想的一个jquery插件
2010/11/19 Javascript
JavaScript实现的图像模糊算法代码分享
2014/04/22 Javascript
html5+javascript制作简易画板附图
2014/04/25 Javascript
3个可以改善用户体验的AngularJS指令介绍
2015/06/18 Javascript
jQuery中的ready函数与window.onload谁先执行
2016/06/21 Javascript
基于BootStrap实现局部刷新分页实例代码
2016/08/08 Javascript
jQuery中的deferred使用方法
2017/03/27 jQuery
基于JavaScript实现百度搜索框效果
2020/06/28 Javascript
js实现登录注册框手机号和验证码校验(前端部分)
2017/09/28 Javascript
seajs中最常用的7个功能、配置示例
2017/10/10 Javascript
vue-cli项目中使用Mockjs详解
2018/05/14 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
[01:15:12]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#4Newbee VS CDEC
2016/03/03 DOTA
Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)
2018/10/22 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
python3.6使用urllib完成下载的实例
2018/12/19 Python
运用PyTorch动手搭建一个共享单车预测器
2019/08/06 Python
Django自带日志 settings.py文件配置方法
2019/08/30 Python
python实现暗通道去雾算法的示例
2020/09/27 Python
Python析构函数__del__定义原理解析
2020/11/20 Python
Pandas对每个分组应用apply函数的实现
2020/12/13 Python
2014年大学庆元旦迎新年活动方案
2014/03/09 职场文书
教师对学生的寄语
2014/04/03 职场文书
建筑工程专业大学生求职信
2014/04/23 职场文书
医院见习报告范文
2014/11/03 职场文书
2014年学校后勤工作总结
2014/12/06 职场文书
处世之道:关于真诚相待的名言推荐
2019/12/02 职场文书
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
2021/10/16 Python
一篇文章看懂MySQL主从复制与读写分离
2021/11/07 MySQL