Auth: 王海飞
Data:2018-09-07
Email:779598160@qq.com
github:https://github.com/coco369/knowledge
在Django中经常使用富文本编辑来编辑文本内容。富文本编辑器有很多可以选择,比如baiduEditor,tinymce,kindeditor等等。在此我选择使用kindeditor富文本编辑器,KindEditor 使用 JavaScript 编写,可以无缝地与 Java、.NET、PHP、ASP 等程序集成,很适合做网站的文本编辑器来使用。
下载 KindEditor 最新版本,下载之后打开 examples/index.html 就可以看到演示。
步骤1: 下载传送门地址
步骤2: 将下载的kindeditor解压,并删除无用的asp、jsp、php等配置文件夹。
步骤3: 将kindeditor文件夹拷贝放在static中
如:
要使用kindeditor富文本编辑器需要在settings.py文件中配置静态static解析路径,以及media文件解析路径。并且在页面中进行相关js的加载,和上传路径的指定等。
STATIC_URL = '/static/'
# 配置static的路径
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
MEDIA_URL = '/media/'
# 配置media的路径
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
步骤1:引入js, 定义上传图片等文件的地址
{% extends 'base.html' %}
{% block title %}
文章编辑页面
{% endblock %}
{% block Js %}
{% load static %}
<script type="text/javascript" src="{% static 'kindeditor/kindeditor-all.js' %}"></script>
<script type="text/javascript" src="{% static 'kindeditor/lang/zh-CN.js' %}"></script>
<script type="text/javascript">
KindEditor.ready(function(K) {
window.editor = K.create('#editor_id',{
uploadJson:'/util/upload/kindeditor'
});
});
</script>
{% endblock %}
{% block content %}
<form action="" method="post">
{% csrf_token %}
{{ msg }}
标题:<input type="text" name="title">
内容:<textarea id="editor_id" name="content"></textarea>
<p><input type="submit" value="提交"></p>
</form>
{% endblock %}
uploadJson参数为:'/util/upload/kindeditor',该URL实现了上传文件的方法。该URL对应的视图函数,在步骤3中定义。
初始化定义富文本编辑器的对象
步骤3:定义uploadJson实现的方法
a)在urls.py中定义处理上传文件的URL规则
在工程目录的urls.py文件中定义上传图片的配置和访问media路径的配置
from django.urls import path, include, re_path
from django.contrib.staticfiles.urls import static
from utils.upload_image import upload_image
# kindeditor编辑器上传图片地址
re_path(r'^util/upload/(?P<dir_name>[^/]+)$', upload_image, name='upload_image'),
# 配置media访问路径
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
应用app的urls.py中定义编辑和列表的方法:
# 编辑文章
path(r'edit_article/', views.edit_article, name='edit_article'),
# 文章列表
path(r'article/', views.article, name='article'),
b)在utils中定义upload_images文件,并定义upload_image函数
# -*- coding: utf-8 -*-
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()
dir_name = dir_name + '/%d/%d/' %(today.year,today.month)
if not os.path.exists(settings.MEDIA_ROOT + dir_name):
os.makedirs(settings.MEDIA_ROOT + dir_name)
return dir_name
# 图片上传
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 = upload_generation_dir(dir_name)
path=os.path.join(settings.MEDIA_ROOT, relative_path_file)
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 + relative_path_file + file_name
open(path_file, 'wb').write(files.file.read()) # 保存图片
return {"error": 0, "url": file_url}
步骤4:实现编辑上传功能
def edit_article(request):
"""
文章编辑方法
"""
if request.method == 'GET':
return render(request, 'edit.html')
if request.method == 'POST':
# 获取文章的标题和内容
title = request.POST.get('title')
content = request.POST.get('content')
# 使用all()方法进行判断,如果文章标题和内容任何一个参数没有填写,则返回错误信息
if not all([title, content]):
msg = '请填写完整的参数'
return render(request, 'edit.html', {'msg': msg})
# 创建文章
Article.objects.create(title=title,
content=content)
# 创建文章成功后,跳转到文章列表页面
return HttpResponseRedirect(reverse('users:article'))
def article(request):
"""
文章展示方法
"""
if request.method == 'GET':
# 获取所有的文章
articles = Article.objects.all()
return render(request, 'article.html', {'articles': articles})