完整的后台界面怎么能够没有文本编辑器,可是django的admin界面很疑惑,没有自带文本编辑器,好在网上有很多成型的库能够用html
我用的是ckeditor编辑器,安装和配置我引用别人的博客java
这篇博客配置讲的很详细,以后就能够用RichTextField来定义模型,后台默认就是文本编辑器。node
可是问题来了,文本编辑器是没有上传图片的功能,只能贴连接。python
网上之前有两篇博客也是讲上传的,一篇是java web,一篇是django的jquery
django的连接在这里 django下ckeditor上传图片的实现web
javaweb的连接在这里 CKEditor实现图片上传 ajax
建议先看完这两篇,我在看django这一篇的时候就发现,django这篇博客里面的步骤一以下:django
步骤1:服务器
下载ckeditor,找到image.js这个文件,搜索“upload”能够找到这一段id:'Upload',hidden:true。实际上上传功能被隐藏了,把上面的true改为false,再打开编辑器,就能找到上传功能了。编辑器
最新5.02版本彷佛搜索不到,我直接参考java web这一篇
原文:第一种:仍是刚才那个image.js
搜索“upload”能够找到这一段 id:'Upload',hidden:true,而我使用的4.3的是
config.filebrowserImageUploadUrl= "admin/UserArticleFileUpload.do"; //待会要上传的action或servlet
这篇文章还讲了怎么去掉图片预览框里面的一堆英文,能够参考一下,我用上文的第二种方法,缘由是第一种方法搜索文件里面的时候不存在,不过不用担忧,第二种方法妥妥的,先
看下我本身修改后的,config.js文件吧
/** * Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. * For licensing, see LICENSE.md or http://ckeditor.com/license */ CKEDITOR.editorConfig = function( config ) { // Define changes to default configuration here. For example: // config.language = 'fr'; // config.uiColor = '#AADC6E'; config.image_previewText=' '; config.filebrowserImageUploadUrl= "/uploadimg/"; };
什么意思,我讲一下,第二个和java的不同,缘由是我在后台测试上传的时候报错,由于他是提交到这个url(服务器+端口+“/uploadimg/”)的,因此我就在django里面url对应的视图写下以下url:
from django.conf.urls import include, url from django.contrib import admin from sjjgWeb.views import * from mySjjg.settings import BASE_DIR urlpatterns = [ url(r'^ckeditor',include('ckeditor_uploader.urls')), url(r'^admin/', include(admin.site.urls)), url(r'^$',index), url(r'^index$',index,name='homepage'), url(r'^login$',login), url(r'^reg$',register), url(r'^test$',test), url(r'index/(?P<root>\d)/(?P<node>\d)',information,name='information'),
url(r'^uploadimg/',upload_image), #重点看这个,别的不用看 <<<——————————<<<看这里
url(r'^upload/(?P<path>(\S)*)','django.views.static.serve',{'document_root':BASE_DIR+'\upload'}), ]
也就是说个人config.js里面写的是对应的url,这样的话大家就能够取本身喜欢的名字,而后视图函数upload_image参考了一下django-ckeditor那篇文章的步骤三的那一段代码
我作了小小的修改,粗略的看了一下,成功后就没有再去看过,有什么问题欢迎提出。
import time @csrf_protect def upload_image(request): if request.method == 'POST': callback = request.GET.get('CKEditorFuncNum') try: path = "upload/" + time.strftime("%Y%m%d%H%M%S",time.localtime()) <---还有这里,这里path修改你要上传的路径,我记得我是修改了的,这样就上传到了upload文件夹 f = request.FILES["upload"] file_name = path + "_" + f.name des_origin_f = open(file_name, "wb+") for chunk in f: <--#我修改的是这里,由于python后期的版本放弃了chunk函数,直接遍历类文件类型就能够生成迭代器了。 des_origin_f.write(chunk) des_origin_f.close() except Exception, e: print e res = r"<script>window.parent.CKEDITOR.tools.callFunction("+callback+",'/"+file_name+"', '');</script>" return HttpResponse(res) else: raise Http404()
注意import time和Http404,原文是没有提到的。具体本身看看,反正这段代码不难。
作到这里之后,我测试的时候,最新版本上传图片的时候,那里失败后有个height很矮的框框,根本不知道里面是什么,我直接用鼠标进去,所有复制黏贴下来,在文本文件里查看
发现是csrf,也就是django那篇博客说的步骤4吧,其实在步骤三的时候,也是我复制黏贴看错误,发现路径之后测试的。最重要是那篇博客后面有步骤五没提到
csrf有经验的都知道,ajax提交的话就要用的一段官方代码,django那篇博客讲的仍是挺清楚的,我这里附上我修改后的文件截图
学过jquery都知道,在(function(){ 这里面最前面加就好了。 })
而后是表单,按照原文搜索获得了
我添加后是这一串,本身慢慢看
'<form enctype="multipart/form-data" method="POST" dir="'+k+'" lang="'+l+'" action="',CKEDITOR.tools.htmlEncode(d.action),'"><input type="hidden" name="csrfmiddlewaretoken" value="'+getCookie("csrftoken")+'">
以后就ok了,然而上传时成功了,可是图片预览不到,哈哈,由于django的url访问方式你也是知道的,并非传统的静态文件访问访问,我试了不少方式,包括本身写view,最后解决办法是这样,
url那一串我发现默认访问路径最后是,,127.0.0.1/upload/342328305230.jpg,相似如此,很明显,咱们没有upload视图函数嘛,因而我本身写了一个。
先再一次看看个人url
from django.conf.urls import include, url from django.contrib import admin from sjjgWeb.views import * from mySjjg.settings import BASE_DIR urlpatterns = [ url(r'^ckeditor',include('ckeditor_uploader.urls')), url(r'^admin/', include(admin.site.urls)), url(r'^$',index), url(r'^index$',index,name='homepage'), url(r'^login$',login), url(r'^reg$',register), url(r'^test$',test), url(r'index/(?P<root>\d)/(?P<node>\d)',information,name='information'), url(r'^uploadimg/',upload_image),
url(r'^upload/(?P<path>(\S)*)','django.views.static.serve',{'document_root':BASE_DIR+'\upload'}), <---这一次重点是这里 ]
原本本身写了视图函数,最后发现系统有默认静态处理的,第一个参数是 都懂得,第二个是系统的默认静态管理函数,第三个是上传的以为路径,我引用了setting文件的BASE_DIR变量,最后加上你上传文件的文件夹就能够像访问静态文件同样访问了。到这里就一切大功告成了。。。附上个人成功图片。
想问我为何后台管理为何那么漂亮,我不会告诉你是djangoadminsuit皮肤的。