如何将文件上传进度条添加到Django websi

2024-10-05 13:16:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图使用django-progressbarupload app向我的Django应用程序添加进度条。但它不起作用。。。。django-progressbarupload app模板标记加载正常,文件也正在上载到服务器,但进度条没有显示…并且它们在控制台上没有javascript错误。。。我一直在关注这个tutorial

有人能告诉我如何在Django应用程序中添加进度条吗


Tags: 文件django进度条标记服务器模板app应用程序
2条回答

这显然是基于webkit的浏览器中的一个bug,下面是相关的线程:

Ajax form upload progress bar

还有一个相关的github问题:

https://github.com/ouhouhsami/django-progressbarupload/issues/2

要理解,webkit不允许在上传文件时进行ajax调用,通常的解决方法是使用动态创建的iframe(在上面的SO thread中提到)。

它不是最好的解决方案(也不是那么一致),但它将是最容易实现的。

创建js文件,例如progress_bar.js

在您的admin.py中

class YouSuperModelAdmin(admin.ModelAdmin):
    ...
    class Media:
        js = ['/static/js/progress_bar.js']
    ...

正在进行中

(function($){   
$(function(){
    $(document).ready(function() {
        $( "#form_id" ).submit(function( event ) {
          event.preventDefault();

          var post_data = new FormData($("form")[0]);

          $.ajax({
              xhr: function() {
                var xhr = new window.XMLHttpRequest();
                var new_div = document.createElement('div');

                new_div.innerHTML = '<progress id="progressBar" value="0" max="100" style="width:300px;"></progress><h3 id="status"></h3><p id="loaded_n_total"></p>';
                document.getElementsByClassName('submit-row')[0].appendChild(new_div)

                xhr.upload.addEventListener("progress", progressHandler, false);
                xhr.addEventListener("load", completeHandler, false);
                xhr.addEventListener("error", errorHandler, false);
                xhr.addEventListener("abort", abortHandler, false);

                return xhr;
              },
                url: window.location.href,// to allow add and edit
                type: "POST",
                data: post_data,
                processData: false,
                contentType: false,
                success: function(result) {
                    window.location.replace("/admin/yourapp/yoursupermodel/");
              }
            });
        });
    });
});  
})(django.jQuery);

其思想是防止默认表单提交,创建新的XMLHttpRequest,用消息注入progressbar,然后发送显示进程的数据。

设置processData:false、contentType:false,非常重要,否则它将无法处理表单中的文件

最后在progress_bar.js中为进度条本身设置事件处理程序。

function _(el) {
  return document.getElementById(el);
}

function progressHandler(event) {
  _("loaded_n_total").innerHTML = "Uploaded " + event.loaded + " bytes of " + event.total;
  var percent = (event.loaded / event.total) * 100;
  _("progressBar").value = Math.round(percent);
  _("status").innerHTML = Math.round(percent) + "% uploaded... please wait";
}

function completeHandler(event) {
  _("status").innerHTML = event.target.responseText;
  _("progressBar").value = 0; //wil clear progress bar after successful upload
}

function errorHandler(event) {
  _("status").innerHTML = "Upload Failed";

}

function abortHandler(event) {
  _("status").innerHTML = "Upload Aborted";
}

注意:要避免成功后html页面出现在表单下,您必须更改返回HttpResponse对象的视图,或者只需更改window.location。

所描述的方法适用于django的任何表单。

相关问题 更多 >

    热门问题