美文网首页
Django使用edtor.md添加图片的支持

Django使用edtor.md添加图片的支持

作者: 吾星喵 | 来源:发表于2018-06-23 16:22 被阅读22次

    Django使用edtor.md添加图片的支持

    测试竟然只能在谷歌浏览器起作用。

    模型

    # 图片存储
    class WiKiContentImage(models.Model):
        wiki = models.ForeignKey(TitleTree, on_delete=models.CASCADE, null=True, blank=True, related_name='wiki_images', verbose_name='所属文章')
        title = models.CharField(max_length=50, null=True, blank=True, verbose_name='标题')
        image = models.ImageField(upload_to='images/wiki/%Y/%m', blank=True, null=True, verbose_name='图片')
        created_user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='wiki_images', verbose_name='上传人员')
        created_time = models.DateTimeField(auto_now_add=True, null=True, blank=True, verbose_name='创建时间')
    
        class Meta:
            verbose_name = 'WiKi图集'
            verbose_name_plural = verbose_name
    
        def __str__(self):
            return self.title
    

    视图

    编辑文章视图

    # WiKi更新及创建视图
    class WiKiContentEdit(View):
        @method_decorator(login_required(login_url='/account/login/?next=/wiki/wiki_backend/'))
        def get(self, request, title_id):
            current_url = reverse('wiki:wiki_edit', kwargs={'title_id': title_id})
            wiki_backend_url_list = get_group_url_list(current_url)
    
            wiki_content = ''
            wiki_title = get_object_or_404(TitleTree, id=title_id)
    
            if WiKiContent.objects.filter(title__id=title_id):
                show_content = True
                wiki_content = WiKiContent.objects.get(title__id=title_id)
            else:
                show_content = False
    
            titles = TitleTree.objects.all()
            tags = Tag.objects.all()
    
            # 推荐星级转换为列表
            star_list = list(map(lambda x: {'num': x[0], 'mean': x[1]}, WiKiContent.STAR))
            return render(request, 'backend/wiki_edit.html',
                          {
                              'titles': titles,
                              'tags': tags,
                              'wiki_content': wiki_content,
                              'show_content': show_content,
                              'title_id': title_id,
                              'wiki_title': wiki_title,
                              'WIKI_MENU_GROUP': wiki_backend_url_list,
                              'star_list': star_list,
                          })
    
        @method_decorator(login_required(login_url='/account/login/?next=/wiki/wiki_backend/'))
        def post(self, request, title_id):
            title_new = request.POST.get('title_new')
            content = request.POST.get('content')
            recommend = request.POST.get('recommend')
            author_message = request.POST.get('author_message')
            # print(title_new)
            wiki_title = get_object_or_404(TitleTree, id=title_id)
            wiki_title.name = title_new
            wiki_title.save()
            # print(wiki_title)
            tags_new = request.POST.getlist('tags')
            tags_new = Tag.objects.filter(id__in=tags_new)
            # print(tags_new)
            if WiKiContent.objects.filter(title__id=title_id):
                wiki_content = WiKiContent.objects.get(title__id=title_id)
                wiki_content.title = wiki_title
                wiki_content.content = content
                wiki_content.tags = tags_new
                wiki_content.recommend = int(recommend)
                wiki_content.author_message = author_message
                wiki_content.updated_user = request.user
                wiki_content.save()
            else:
                # print('文章不存在,新建')
                wiki_content = WiKiContent.objects.create(
                    title=wiki_title,
                    content=content,
                    # tags=tags_new,  # 直接在这儿使用会报错
                    created_user=request.user,
                )
                wiki_content.tags = tags_new
                wiki_content.save()
            return redirect(reverse("wiki:wiki_content_backend", kwargs={'title_id': title_id}))
    

    上传图片视图

    from django.core.files.base import ContentFile
    
    # @csrf_exempt
    def upload_image(request):
        print(request.POST)
        """
        <QueryDict: {'csrfmiddlewaretoken': ['8gtiXSn7Lz0UFrRt9kdN3BPFHMEVvJb75qQchYfb7MfK1PEIJ42tSmBltWlqG8AE', '8gtiXSn7Lz0UFrRt9kdN3BPFHMEVvJb75qQchYfb7MfK1PEIJ42tSmBltWlqG8AE']}>
        """
        print(request.FILES)
        """
        <MultiValueDict: {'editormd-image-file': [<InMemoryUploadedFile: Markdown.png (image/png)>]}>
        """
        image = request.FILES.get('editormd-image-file', None)
        # 将上传的图片绑定到标题,因为它是先创建保存数据库的,如果绑定到正文,则编辑不存在的正文时,会出现模型找不到的情况
        wiki_title = get_object_or_404(TitleTree, id=request.GET.get('wiki_title_id'))
    
        if image:
            wiki_content_image = WiKiContentImage(
                title=image.name,
                image=image,
                wiki=wiki_title,
                created_user=request.user
            )
            wiki_content_image.save()
            image_url = wiki_content_image.image.url
    
            res = {
                'success': 1,
                'message': '图片上传成功',
                'url': image_url
            }
        else:
            res = {
                'success': 0,
                'message': '图片上传失败',
            }
        return HttpResponse(json.dumps(res), content_type="text/html")
        # 会出错Resource interpreted as Document but transferred with MIME type application/json
        # return HttpResponse(json.dumps(res), content_type="application/json")
    

    如果想屏幕CSRF,则可以在视图中添加csrf_exempt装饰器

    路由

    url(r'^upload_image/', upload_image, name='upload_image'),
    

    编辑模板

    截取一部分代码

    <link rel="stylesheet" href="{% static 'editor.md/css/editormd.min.css' %}" />
    
    
    <div class="form-group">
        <label>WiKi正文</label>
        <div id="wiki_edit_content_md">
            <!--添加Markdown编辑器-->
            <textarea name="content"
                      placeholder="输入WiKi内容">{{ wiki_content.content|safe }}</textarea>
        </div>
        <p><div class="text-warning"><small></small></div></p>
    </div>
    
    
    <!-- 在HTML中加载JS:顺序为jQuery,editormd.min.js -->
    <script src="{% static 'editor.md/editormd.min.js' %}"></script>
    
    <script type="text/javascript">
        $(function() {
            let editor = editormd("wiki_edit_content_md", {
                path: "{% static 'editor.md/lib/' %}", // Autoload modules mode, codemirror, marked... dependents libs path
                // width : "1000px",  //设置宽度
                placeholder: "请输入WiKi内容 ...",  // 输入框提示文字
                height: 600,
                syncScrolling: "single",
                saveHTMLToTextarea : true,  //注意:这个配置,方便post提交表单,关乎后端是否可以获取到值
                watch : false,
                tocm: true, // Using [TOCM]
    
                //  imageUpload参数在console/markdown_editor/plugins/image-dialog/image-dialog.js文件中进行if判断
                //  利用其传参特性将csrf_token传入image-dialog.js文件进行form表单生成
                imageUpload: "true",
                imageFormats: ["jpg", "jpeg", "gif", "png", "bmp", "webp"],
                imageUploadURL: "{% url 'wiki:upload_image' %}?wiki_title_id={{ title_id }}",
                imageCsrfToken: "{% csrf_token %}",
    
                /*
                 {
                    success   : 0 | 1,   // 0 表示上传失败,1 表示上传成功
                    message   : "提示的信息,上传成功或上传失败及错误信息等。",
                    url       : "远程图片地址"    //上传成功时才返回,就是图片的访问地址
                 }
                 */
    
            });
            /*
            // or
            var editor = editormd({
                id   : "editormd",
                path : "../lib/"
            });
            */
        });
    </script>
    

    可以添加图片描述,图片链接是点击这个图片跳转的url

    修改editor.md添加csfr_token支持

    编辑 static\editor.md\plugins\image-dialog\image-dialog.js , 修改dialogContent,添加settings.imageCsrfToken

    var dialogContent = ( (settings.imageUpload) ? "<form action=\"" + action +"\" target=\"" + iframeName + "\" method=\"post\" enctype=\"multipart/form-data\" class=\"" + classPrefix + "form\">" : "<div class=\"" + classPrefix + "form\">" ) +
                            ( (settings.imageUpload) ? "<iframe name=\"" + iframeName + "\" id=\"" + iframeName + "\" guid=\"" + guid + "\"></iframe>" : "" ) +
                            "<label>" + imageLang.url + "</label>" +
                            "<input type=\"text\" data-url />" + (function(){
                                return (settings.imageUpload) ? "<div class=\"" + classPrefix + "file-input\">" +
                                                                    "<input type=\"file\" name=\"" + classPrefix + "image-file\" accept=\"image/*\" />" +
    
                                                                    settings.imageCsrfToken +  //添加csrf
    
                                                                    "<input type=\"submit\" value=\"" + imageLang.uploadButton + "\" />" +
                                                                "</div>" : "";
                            })() +
                            "<br/>" +
                            "<label>" + imageLang.alt + "</label>" +
                            "<input type=\"text\" value=\"" + selection + "\" data-alt />" +
                            "<br/>" +
                            "<label>" + imageLang.link + "</label>" +
                            "<input type=\"text\" value=\"http://\" data-link />" +
                            "<br/>" +
    
                            settings.imageCsrfToken +  //添加csrf
    
                        ( (settings.imageUpload) ? "</form>" : "</div>");
    

    渲染模板

    部分代码

    
    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/vs.min.css">
    
    <p id="id_wiki_content">{{ wiki_content.content }}</p>
    
    
    <script src="https://cdnjs.cloudflare.com/ajax/libs/showdown/1.8.6/showdown.min.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
    
    <script type="text/javascript">
        $(document).ready(() => {
            var src = $('#id_wiki_content').text()
            var converter = new showdown.Converter();
            var html = converter.makeHtml(src);
            $('#id_wiki_content').html(html);
            hljs.initHighlightingOnLoad();
        })
    </script>
    

    相关文章

      网友评论

          本文标题:Django使用edtor.md添加图片的支持

          本文链接:https://www.haomeiwen.com/subject/qffdyftx.html