Django项目使用wangeditor方法

news2024/12/23 13:10:12

一、环境:
python: 3.8

Django :3.2.16

wangeditor: v4 (官方文档地址:wangEditor)

        JS文件下载:https://download.csdn.net/download/weixin_47401101/87379142

编译器:pycharm

二、Django项目admin后台使用wangeditor的方法步骤

1、在项目的settings.py中需要进行的设置,在TEMPLATES中加入关于media的引入,用来处理图片上传的需要。

TEMPLATES = [
    {
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.media',  #专门用来处理用户上传  
            ],
        },
    },
]


# 配置用户上传路径
MEDIA_URL = '/media/'  #图片保存路径位于项目的根目录下吗的media问价夹中
MEDIA_ROOT = BASE_DIR / 'media/'

2、在models.py中设计模型,准备插入富文本编辑器wangeditor的字段使用TexitFidle类型

class content(models.Model):
    xuhao = models.SmallIntegerField(verbose_name='序号',null=True)
    title = models.CharField(verbose_name='标题',max_length=64,null=True)
    neirong = models.TextField(verbose_name='内容') #在后台将富文本编辑器插入到这个字段中

3、admin.py,原理是django的ModelAdmin为提供了一个Media的源类来把js文件插入到页面中去,使用此方法来实现js文件的插入。wangeditor.min.js文件也可以下载到自己的项目中,通过路径引用,例如:'js/wangEditor.min.js'

from django.contrib import admin
from app01.models import content #引入models中设计的模型

@admin.register(content)   #将模型注册到后台
class contentAdmin(admin.ModelAdmin):
    list_display = ('xuhao','title', 'neirong') #设置后台显示的字段

    class Media:  #通过此方法将js文件插入到页面中
        js = (
            'admin/js/vendor/jquery/jquery.min.js', #Django自带的jQuery
            'https://cdn.jsdelivr.net/npm/wangeditor@latest/dist/wangEditor.min.js', #wangeditor的js文件
            #直接引用'js/wangEditor.min.js',
            'js/wang_editor_config.js'   #wangeditor主要的配置文件
        )

 4、页面分析

标号1中的contents是之前设计的content模型,点击标号2中的ADD,弹出右侧的页面,标号3就是model中的‘neirong’字段。标号4是3对应的源代码位置,富文本编辑器将会插入到这个div中,div的class为:class="form-row field-neirong"。

5、wang_editor_config.js,下面的代码可以直接使用,注意看注释,注释比较乱,复用的时候需要修改的地方都标注出来了,具体代码的解释,可以看django快速集成富文本编辑器wangeditor_轻编程的博客-CSDN博客

$(document).ready(function () {
    // 创建富文本编辑器元素节点
    var wehtml = "<div id='wangcontent'></div>"
    // 获取div,复用的时候.field-neirong是根据实际情况进行修改
    var field_div = document.querySelectorAll(".field-neirong>div")
    //给富文本编辑器的DIV加入label,因为下面把原有div的label隐藏了
    field_div[0].insertAdjacentHTML('afterbegin', '<b>内容:</b>');
    //插入上面定义的wehtml
    field_div[0].insertAdjacentHTML('beforeend', wehtml);
    //隐藏原有div的label值,避免重复出现两个框
    $(".field-neirong>div>label").attr('style', 'display:none')

    const E = window.wangEditor
    const editor = new E("#wangcontent")
    //复用的时候下面的ID需要根据情况修改
    const $text1 = $('#id_neirong')
    console.log($text1.val())
    editor.config.onchange = function (html) {
        // 第二步,监控变化,同步更新到 textarea
        $text1.val(html)
    }

    editor.config.height = 500
    // 配置 server 接口地址,复用的时候
    editor.config.uploadImgServer = '/uploadimage/'
    editor.config.uploadFileName = 'spuImg'
    editor.create()
    editor.txt.html($text1.val())
    // 第一步,初始化 textarea 的值
    $text1.val(editor.txt.html())
    //隐藏原有的输入框
    $text1.attr("style","display:none")

})

 6、views.py

from django.http import JsonResponse
from django.conf import settings

# 引入登录验证,只有登录了才能上传图片
from django.contrib.auth.mixins import LoginRequiredMixin
# 引入Django的基类视图
from django.views.generic import View
# 引入屏蔽CSRF的方法
from django.views.decorators.csrf import csrf_exempt
#类视图装饰器使用的时候,必须包裹在这个里面
from django.utils.decorators import method_decorator

class UploadImage(LoginRequiredMixin, View):
    """富文本编辑器上传图片
    首先会检查项目根目录有没有media/upload/的文件夹
    如果没有就创建,图片最终保存在media/upload/目录下
    返回图片路径为 "/media/upload/file.png"
    如果因为权限不够,不能创建media,就手动进行创建。
    """

    @method_decorator(csrf_exempt)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)

    def post(self, request, *args, **kwargs):
        import os
        import uuid
        file_data = request.FILES
        keys = list(file_data.keys())
        # 使用项目根目录拼接路径
        file_path = settings.BASE_DIR / 'media/upload/'
        if os.path.exists(file_path) is False:
            os.mkdir(file_path)
        # 返回数据中需要的data
        data = []
        for key in keys:
            img_dict = {}
            file = file_data.get(f'{key}')
            # 重命名文件名称
            names = list(os.path.splitext(file.name))
            names[0] = ''.join(str(uuid.uuid4()).split('-'))
            file.name = ''.join(names)
            new_path = os.path.join(file_path, file.name)
            # 开始上传
            with open(new_path, 'wb+') as f:
                for chunk in file.chunks():
                    f.write(chunk)
            # 构造返回数据
            img_dict['url'] = f'/media/upload/{file.name}'
            data.append(img_dict)
        context = {"errno": 0, "data": data}
        return JsonResponse(context)

7、urls.py

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    #下面是上传图片的url
    path("uploadimage/", views.UploadImage.as_view(), name="upload_img"),

]
# 使用nigx部署的时候就不需要这么设置了,转发静态文件就可以了,只是调试的需要这么操作
urlpatterns += static(settings.STATIC_URL,document_root = settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL,document_root = settings.MEDIA_ROOT)

 8、效果展示,可以上传图片,同事上传多张也可以。

 三、Django项目前端modelform生成的表的textare字段插入wangeditor的方法步骤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/154983.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

日志分析工具--花两天时间为自己开发个小工具值得吗?

这两天忙里偷闲整理开发了个小的日志分析工具&#xff0c;没错&#xff0c;是给自己使用的&#xff0c;工欲善其事必先利其器。 先说一下痛点&#xff0c; 1、经常会遇到需要在外网服务器上调试的情况&#xff0c;此时只能通过日志来调试信息。 2、当使用记事本打开日志文件后&…

windows驱动开发-WDF编程

文章目录前言WDF编程前的准备工作WDF编程创建驱动对象创建设备对象设备对象的回调函数链表操作驱动的测试代码前言 注&#xff1a;本文的完整代码见仓库 18-WDF-reflect 代码参考自&#xff1a;junjiexing/libredirect 我不是从事驱动开发的专业人员&#xff0c;打酱油需要用…

区块链Fabric-从入门到实战(二) Fabric环境搭建

Fabric ubuntu16虚拟机环境搭建Ubuntu16镜像ubuntu-16.04.3-server-amd64.iso &#xff08;如有需要&#xff0c;私信我&#xff09;修改软件源cd /etc/apt/sudo cp sources.list sources.list.baksudo gedit sources.listdeb-src http://mirror.neu.edu.cn/ubuntu/ xenial mai…

回望在CSDN的2022和展望全新的2023

前言时光如白驹过隙&#xff0c;这条消息提醒着我加入CSDN有一些日子了。4286天&#xff0c;只是一个普通的数字&#xff0c;却记录着与CSDN的每一天。过去太长&#xff0c;回望过去的2022&#xff0c;有很多的收获和成长。在C站结实了一些朋友&#xff0c;分享了自己在工作中的…

校园跑腿、校园脱单、代理、帮忙拿快递的微信小程序 基于SpringBoot、Mybatis-plus、mysql实现

一、文件夹说明 代码下载 地址:校园跑腿、校园脱单、代理、帮忙拿快递的微信小程序 server 后端项目 project&#xff1a; 项目 CBD&#xff1a; 校园跑腿服务&#xff08;校园CBD中心&#xff09; server-app: 小程序apiserver-pc: 小程序后台管理service-cgs-base-service:…

RK3399平台开发系列讲解(CPU篇)CPUFreq 中央处理器频率调节技术

🚀返回专栏总目录 文章目录 一、CPUFreq组成二、设备树配置沉淀、分享、成长,让自己和他人都能有所收获!😄 📢中央处理器频率调节(Central Processing Unit frequency,CPUFreq)技术可以降低ARM芯片的功耗,例如在系统对任务压力较小时,通过调整处理器工作频率与输入…

Javascript判断点是否在多边型内

射线法Ray-casting Algorithm算法检查点point是否在多边形里面。用法&#xff1a;insidePolygon([[x1,y1],[x2,y2],[x3,y3]...], [x , y])参数说明&#xff1a;polygon多边形坐标集合&#xff0c;格式为[[x1,y1],[x2,y2],[x3,y3]...]。point 测试点坐标, 格式为[x , y]。返回tr…

技术分享| 视频监控融合方案

视频监控系统在各行业应用广泛&#xff0c;从早期的只是简单的实现通过视频记录监控区域的情况&#xff0c;到现在的监控侦测、智能报警、融合通信等功能&#xff0c;视频监控的作用已经不是简单的记录&#xff0c;分布在各地的视频监控摄像头可以通过复杂的软件算法实现更多智…

数据分析的尽头不是可视化,而是行动!行动!行动!

Kyligence Zen 联动飞书&#xff0c;支持一键推送指标&#xff0c;在飞书就能追踪关键指标的最新动态&#xff1b;指标对齐目标&#xff0c;目标拆解为飞书任务&#xff0c;实现从指标洞察到行动的丝滑闭环&#xff01; 指标是衡量目标的量化参数&#xff0c;也是企业将战略目标…

PC端网页特效:轮播图

轮播图 功能需求&#xff1a; 鼠标经过轮播图模块&#xff0c;左右按钮显示&#xff0c;离开隐藏左右按钮。点击右侧按钮一次&#xff0c;图片往左播放一张&#xff0c; 左侧按钮同理。图片播放的同时&#xff0c;下面小圆圈模块跟随一起变化。点击小圆圈&#xff0c;可以播放…

2023年系统集成项目管理工程师报考条件及时间安排

一、报考条件 二、考试时间安排 集成考试一年会考2次&#xff0c;上半年一次、下半年一次 考试内容&#xff1a; 三、考试知识点分布&#xff1a; 给出一点点中项备考攻略 中级我敢说是好考的&#xff0c;题目也不难&#xff0c;主要弄清楚47个过程的输入输出&#xff0c;还有…

Github每日精选(第87期):轻量级图表lightweight-charts

lightweight-charts TradingView 轻量级图表是最小和最快的金融 HTML5 图表之一。 如果您想在网页上将财务数据显示为交互式图表而不影响网页加载速度和性能&#xff0c;轻量级图表库是您的最佳选择。 如果您想用交互式图表替换静态图像图表&#xff0c;它是您的最佳选择。该…

2000亿补贴申请倒计时!维视智造院校实验室建设攻略来了(六)!

#千亿政策贴息助力院校设备升级#近期&#xff0c;关于高校教育信息化的利好政策密集出台。9月7日&#xff0c;国务院常务会议提出对高校、职业院校和实训基地等10大领域设备购置和更新改造新增贷款&#xff0c;实施阶段性鼓励政策&#xff0c;中央财政贴息2.5个百分点&#xff…

电脑重装系统后文件还能恢复吗?恢复文件的详细图文教程

电脑重装系统&#xff0c;简单来说就是重新安装电脑的操作系统。一般选择重新安装电脑的系统&#xff0c;无非是电脑蓝屏、系统运行速度慢、崩溃死机等问题。 很多人会有疑惑&#xff0c;电脑重装系统后文件还能恢复吗&#xff1f;重装系统会造成数据全部被清空的情况&#xf…

js性能优化小技巧(已更新)

1、if多条件判断如果if里面包含多个判断条件&#xff0c;可以把判断条件存到一个数组&#xff0c;然后在去这个数组中检索”输入的值“是否满足条件&#xff1b;function testIf(x) {// 冗余if (x a || x b || x c || x d) {console.log(x)}// 简洁if ([a, b, c, d].includ…

前端vue3+typescript搭建vite项目(初识vite+项目配置完善+屏幕适配)

一、文章引导 #mermaid-svg-zCCPryl8cvuE0QpI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-zCCPryl8cvuE0QpI .error-icon{fill:#552222;}#mermaid-svg-zCCPryl8cvuE0QpI .error-text{fill:#552222;stroke:#55222…

MySQL (五)------多表查询练习

我们在开发中&#xff0c;根据不同的业务需求往往需要通过2张及以上的表中去查询需要的数据。所以我们有必要学习2张及以上的表的查询。其实不管是几张表的查询&#xff0c;都是有规律可循的。 1.1 准备数据 -- 部门表 CREATE TABLE dept (id INT PRIMARY KEY PRIMARY KEY, --…

Databend 开源周报 第 75 期

Databend 是一款强大的云数仓。专为弹性和高效设计。自由且开源。即刻体验云服务&#xff1a;https://app.databend.com 。 What’s New 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 Features & Improvements ✨ Format 实现 JSON 输出格式 …

C++模板进阶(非类型模板参数 + 模板特化)

我们另一篇模板初阶介绍链接&#xff1a;http://t.csdn.cn/Ox8Dm 目录 一、非类型模板参数 1.1 非类型模板参数概念 1.2 模板类型的静态数组 二、模板特化 2.1 函数模板特化 2.2 类模板特化 2.2.1 类模板全特化 2.2.2 类模板半特化&#xff08;偏特化&#xff09; 2.2.…

Facebook运营主页需要注意的几个问题

Facebook运营主页需要注意的几个问题主页的权重和流量都是决定流量的关键因素&#xff0c;也就是我们常说的引流&#xff0c;而流量又是需要转化的&#xff0c;因为只有用户认可你&#xff0c;才会有更多的点击、收藏、分享和主页的链接。在社交媒体时代要想更好地推广品牌产品…