经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Django » 查看文章
django使用ckeditor上传图片
来源:cnblogs  作者:new_candy  时间:2018/12/18 9:39:07  对本文有异议

1、在模型类中设置字段为富文本类型,这里需要注意引入的是RichTextUploadingField,以允许上传图片,需要和RichTextField区分开

  1. from ckeditor_uploader.fields import RichTextUploadingField
    class
    spit_model(models.Model):
  2. """模型类"""
  3. user = models.ForeignKey(User, on_delete=models.CASCADE,verbose_name='吐槽发布者')
  4. content = RichTextUploadingField(verbose_name='吐槽内容', max_length=200)

2、项目中ckeditor的安装及配置

  1. pip install django-ckeditor
  1. INSTALLED_APPS = [
  2. ...
      'ckeditor', # 富文本编辑器
  3.   'ckeditor_uploader', # 富文本编辑器上传图片模块
  4. ...
  5. ]
  1. # 富文本编辑器ckeditor配置
  2. CKEDITOR_CONFIGS = {
  3. 'default': {
  4. 'toolbar': 'full', # 工具条功能
  5. 'height': 300, # 编辑器高度
  6. 'width': 300, # 编辑器宽
  7. },
  8. }

 CKEDITOR_UPLOAD_PATH = ''  # 图片ckeditor文件上传路径,这里使用七牛云存储,不填

2、html页面中加入textarea标签

  1. <div>
    <
    textarea id="editor_id"></textarea>
    </div>

3、页面中引入控制html页面的JS和ckeditor的JS文件, 在django的installed_app中注册应用时,会自动在虚拟环境中生成应用信息/home/python/.virtualenvs/django_1.11.16_py3/lib/python3.5/site-packages/ckeditor/static/ckeditor/ckeditor/

  1. js路径前加上域名,否则服务器会在live-server的默认端口下进行网络通讯,查找js
  1. <script type="text/javascript" src="js/spit-submit.js"></script>
    <
    script src="http://127.0.0.1:8000/static/ckeditor/ckeditor/ckeditor.js"></script>

4、在vue变量的mounted方法中加入

  1. let vm = new Vue({
  2.   ...
  3. mounted:function () {
  4. CKEDITOR.replace('editor_id', { filebrowserUploadUrl:'http://127.0.0.1:8000/ckeditor/upload/' }); // 将id选择器的文本域替换成为富文本,并手动设置文件上传的请求路径,默认请求路径为live-server的路径,必须设置为服务器的域名和端口
  5. },
  6. });

5、后端设置总路由,'ckeditor_uploader.urls'中会将接收到的请求进行csrf校验免除,并限制了只有登录用户才可以上传图片,ckeditor默认应用的是django-admin的用户校验方法,django-admin的校验方法不允许跨域请求,我们需要使上传图片的类试图函数继承自django-restframework的APIVIew,

  1.    # url(r'^ckeditor/', include('ckeditor_uploader.urls')), # 为富文本编辑器添加总路由
  2. # url(r'^ckeditor/upload/', ImageUploadView.as_view()), # 为富文本编辑器添加总路由
  3. # url(r'^ckeditor/upload/', csrf_exempt(ImageUploadView.as_view())), # 为富文本编辑器添加总路由
  4. url(r'^ckeditor/', csrf_exempt(ImageUploadView.as_view())), # 为富文本编辑器添加总路由

6、在应用中改写路由和类视图,使用permission_classes对请求权限进行限制

  1. # 配置路由
  2. urlpatterns = [
  3. url(r'^upload/$', ImageUploadView.as_view()),
  4. ]
  5. from ckeditor_uploader import image_processing,utils
  6. from django.conf import settings
  7. from django.http import HttpResponse
  8. from django.http import JsonResponse
  9. from rest_framework.permissions import IsAuthenticated
  10. from rest_framework.views import APIView
  11. from django.utils.html import escape
  12. class ImageUploadView(APIView):
  13. permission_classes = [IsAuthenticated]
  14. http_method_names = ['post']
  15. def post(self, request, **kwargs):
  16. """
  17. Uploads a file and send back its URL to CKEditor.
  18. """
  19. uploaded_file = request.FILES['upload']
  20. backend = image_processing.get_backend()
  21. ck_func_num = request.GET.get('CKEditorFuncNum')
  22. if ck_func_num:
  23. ck_func_num = escape(ck_func_num)
  24. # Throws an error when an non-image file are uploaded.
  25. if not getattr(settings, 'CKEDITOR_ALLOW_NONIMAGE_FILES', True):
  26. try:
  27. backend.image_verify(uploaded_file)
  28. except utils.NotAnImageException:
  29. return HttpResponse("""
  30. <script type='text/javascript'>
  31. window.parent.CKEDITOR.tools.callFunction({0}, '', 'Invalid file type.');
  32. </script>""".format(ck_func_num))
  33. saved_path = self._save_file(request, uploaded_file)
  34. if len(str(saved_path).split('.')) > 1:
  35. if(str(saved_path).split('.')[1].lower() != 'gif'):
  36. self._create_thumbnail_if_needed(backend, saved_path)
  37. url = utils.get_media_url(saved_path)
  38. if ck_func_num:
  39. # Respond with Javascript sending ckeditor upload url.
  40. return HttpResponse("""
  41. <script type='text/javascript'>
  42. window.parent.CKEDITOR.tools.callFunction({0}, '{1}');
  43. </script>""".format(ck_func_num, url))
  44. else:
  45. retdata = {'url': url, 'uploaded': '1',
  46. 'fileName': uploaded_file.name}
  47. return JsonResponse(retdata)
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号