类别:python / 日期:2018-03-09 / 浏览:5100 / 评论:0
0、前言:
期初使用的Kendo UI控件中的Editor作为文本编辑器,虽然Editor控件支持上传图片,但是由于配置的复杂性暂时放弃了(Kendo UI的控件功能太强大了)。
django-ckeditor 的使用方法更侧重于在form.py里定义后绑定到前台使用,我们更期望的是不安装包,直接引入js后使用。
这里使用的环境为 python 3.6 + django 2.02,基于tinyMCE控件。
1、引入必要js
从 https://www.tinymce.com/download/ 下载tinyMCE的社区版
从 https://www.tinymce.com/download/language-packages/ 下载汉化文件,放到langs目录中
引入项目:
<script type="text/javascript" src="{% static "vendor/tinymce/tinymce.min.js" %}"></script>
2、配置settings.py
配置Media_root,提供上传图片保存位置:
MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'upload')
3、html页面修改
创建一个隐藏的文件上传按钮:
<input type="file" id="imageFileUpload" style="display: none">
配置tinyMCE:
tinyMCE.init({ selector: 'textarea', theme: "modern", plugins: "spellchecker,directionality,paste,image", file_browser_callback_types: 'image', file_picker_callback: function(callback, value, meta) { if (meta.filetype === 'image') { var fileUploadControl = document.getElementById("imageFileUpload"); fileUploadControl.click(); fileUploadControl.onchange = function () { if (fileUploadControl.files.length > 0) { var localFile = fileUploadControl.files[0]; if (/.(gif|jpg|jpeg|png|bmp)$/.test(localFile.name)){ var formData = new FormData(); formData.append("image", localFile); $.ajax({ url: '{% url 'upload_img' %}', type: 'POST', data: formData, cache: false, contentType: false, processData: false, success: function (data) { callback(data, {alt: localFile.name}); }, error:function () { alert('图片上传失败') } }); } else { alert('只能上传图片') } } else { alert('请选择图片上传') } } } }, convert_urls :false, language: "zh_CN", image_advtab: true, paste_data_images:true });
这里需要说明的是 convert_urls 参数默认为true,会使得我们的相对路径在保存后自动转换,导致下次打开后就不能显示图片了。callback方法第一个参数是设置返回的图片路径。
4、view.py 修改
这里主要是加一个方法接收上传的文件。
from django.conf import settings from django.views.decorators.csrf import csrf_exempt from PIL import Image @csrf_exempt def report_upload(request): try: file = request.FILES['image'] img = Image.open(file) try: file_name = str(uuid.uuid1()).replace("-", "") + os.path.splitext(file.name)[1] img.save(os.path.join(settings.MEDIA_ROOT, "imgs", file_name), img.format) return HttpResponse(settings.MEDIA_URL + 'imgs/{0}'.format(file_name)) except Exception: return HttpResponse("error") except Exception: return HttpResponse("error")
这里要说明的是使用settings.MEDIA_ROOT中的参数作为保存路径,使用Image对象可以对图片做一些处理后再保存。
5。结果
点击编辑器的插入图片按钮,再点击地址栏后面的图标,选择文件就可以上传了,结果测试成功。
发表评论 /