Django中富文本编辑器KindEditor的使用和图片上传

1.简介

KindEditor 是一套开源的在线HTML编辑器,主要用于让用户在网站上获得所见即所得编辑效果,开发人员可以用 KindEditor 把传统的多行文本输入框(textarea)替换为可视化的富文本输入框。 KindEditor 使用 JavaScript 编写,可以无缝地与 Java、.NET、PHP、ASP 等程序集成,比较适合在 CMS、商城、论坛、博客、Wiki、电子邮件等互联网应用上使用

2.主要特点

快速:体积小,加载速度快

开源:开放源代码,高水平,高品质

底层:内置自定义 DOM 类库,精确操作 DOM

扩展:基于插件的设计,所有功能都是插件,可根据需求增减功能

风格:修改编辑器风格非常容易,只需修改一个 CSS 文件

兼容:支持大部分主流浏览器,比如 IE、Firefox、Safari、Chrome、Opera 

3.使用

3.1下载路径: http://kindeditor.net/down.php

下载后根据需求删除以下目录。

asp - ASP程序

asp.net - ASP.NET程序

php - PHP程序

jsp - JSP程序

examples - 演示文件

3.2将文件夹拷贝到项目根目录的/static/文件夹中:

3.3在kineeditor目录下创建conifg.js配置文件

#config.js

KindEditor.ready(function(K) {

        // K.create('textarea[name=content]', {

        K.create('#id_content', {

            width: '800px',

            height: '500px',

        });

});

注释: 这里的#id_content,或是name=content,是通过登录admin后,右击对应控件,选择审查元素获得的。

 3.4在admin.py对应的管理类中添加class Media,引入js文件。

from .models import  Article

class ArticleAdmin(admin.ModelAdmin):

    list_display = ['title']

    class Media:

        js = ('/static/js/kindeditor-4.1.10/kindeditor-all-min.js',

              '/static/js/kindeditor-4.1.10/lang/zh-CN.js',

              '/static/js/kindeditor-4.1.10/config.js')

admin.site.register(Article,ArticleAdmin)

Blog中有文章Model,文章内容会包括各种格式的数据,比如:图片、超链接、段落等。为了达到这个目的,我们可以使用富文本编辑器。

我们有多重选择来使用富文本编辑器,比如kindeditor、django-ckeditor、自定义ModelAdmin的媒体文件。

这样就将kindeditor加上了富文本编辑器。

4.图片上传

但是如果我们上次图片仍然会报错,因为我们并没有处理文件上传按钮。

4.1:在config.js加入

'uploadJson':'/admin/upload/kindeditor',

这里/admin/upload/kindeditor是python的路由。

在url.py中有配置url(r'^admin/upload/(?P<dir_name>[^/]+)$', upload_image, name='upload_image'),

dir_name是文件的存储路径。

4.2:upload_image是自定义的保存图片的函数。

from django.http import HttpResponse

from django.conf import settings

from django.views.decorators.csrf import csrf_exempt

import os

import uuid

import json

import datetime as dt

@csrf_exempt

def upload_image(request, dir_name):

    ##################

    #  kindeditor图片上传返回数据格式说明:

    # {"error": 1, "message": "出错信息"}

    # {"error": 0, "url": "图片地址"}

    ##################

    result = {"error": 1, "message": "上传出错"}

    files = request.FILES.get("imgFile", None)

    if files:

        result = image_upload(files, dir_name)

    return HttpResponse(json.dumps(result), content_type="application/json")

# 目录创建

def upload_generation_dir(dir_name):

    today = dt.datetime.today()

    url_part = dir_name + '/%d/%d/' % (today.year, today.month)

    dir_name = os.path.join(dir_name, str(today.year), str(today.month))

    print("*********", os.path.join(settings.MEDIA_ROOT, dir_name))

    if not os.path.exists(os.path.join(settings.MEDIA_ROOT, dir_name)):

        os.makedirs(os.path.join(settings.MEDIA_ROOT, dir_name))

    return dir_name,url_part

# 图片上传

def image_upload(files, dir_name):

    # 允许上传文件类型

    allow_suffix = ['jpg', 'png', 'jpeg', 'gif', 'bmp']

    file_suffix = files.name.split(".")[-1]

    if file_suffix not in allow_suffix:

        return {"error": 1, "message": "图片格式不正确"}

    relative_path_file, url_part = upload_generation_dir(dir_name)

    path = os.path.join(settings.MEDIA_ROOT, relative_path_file)

    print("&&&&path", path)

    if not os.path.exists(path):  # 如果目录不存在创建目录

        os.makedirs(path)

    file_name = str(uuid.uuid1()) + "." + file_suffix

    path_file = os.path.join(path, file_name)

    file_url =settings.MEDIA_URL + url_part +file_name

    open(path_file, 'wb').write(files.file.read())

    return {"error": 0, "url": file_url}

文件保存后,路径为<img src="/upload/kindeditor/2018/5/dea7fffe-6251-11e8-946f-40b034409066.jpg" alt="" />

4.3:使用django配置/upload来显示图片。

from django.views.static import serve

url(r'^upload/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT, }),

4.4:setting增加media的配置

MEDIA_URL = "/upload/"

MEDIA_ROOT = os.path.join(BASE_DIR, "upload")

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容

  • 由于django后台管理没有富文本编辑器,展示出来的页面不美观,所以我们想要引入第三方富文本编辑器。网上搜寻了一番...
    longshelan_113阅读 611评论 0 1
  • 项目部署到阿里云(nginx+uwsgi)上后,静态文件加载没有问题。但是在本地,使用开发服务器,却始终加载不成功...
    兰山小亭阅读 5,617评论 0 9
  • 2010年,那年徐良的后会无期还流行于各个小女生团体,杀马特这个词还没有发明出来,取而代之的是非主流,那一年,我十...
    小猪爱你阅读 124评论 0 0
  • 新闻里,常看到报道有人是“冻龄”,年老的时候很年轻,漂亮得和年轻的时候没有什么两样。我一直很羡慕这种人。 有一天旁...
    终遇伞上花阅读 166评论 0 1
  • 子夏为莒父宰,问政。子曰:“无欲速,无见小利。欲速则不达,见小利,则大事不成。”——《论语·子路》 子夏向孔子问政...
    金金视界阅读 582评论 1 0