Загрузка файла Django с помощью Ajax-индикатора выполнения - PullRequest
0 голосов
/ 18 сентября 2018

Я относительно новичок в Django и еще новее в JavaScript, так что извините за мой вопрос.Ситуация такая:

1) У меня есть сайт для загрузки файлов, закодированный в Django, с некоторой логикой, подобной приведенной ниже:

def page_query(request):
    ...
    if request.method == 'POST':
       ...
       file_entry = file_form(request.POST, request.FILES)

       if file_entry.is_valid():
           if request.FILES.get('filename', False) != False:
               f = request.FILES['filename']
               fname = time_id + '_' + case_id + '_.ext'
               file_check = data_admin.upload_file(f, fname, upload_path)
               upload_file_path = os.path.join(upload_path, fname)

data_admin.upload_file () - это пользовательская функция, определенная в другом модуле моего проекта с функцией, сводящейся к следующему:

with open(upload_path + fname, 'wb+') as destination:
    for chunk in f.chunks():
        destination.write(chunk)

2) Я хотел добавить своего рода индикатор прогресса загрузки на свой веб-сайт, и во многих источниках явидели людей, рекомендующих решение jQuery Ajax, которое сводится к следующему коду:

$(document).ready(function() {

  $('#form_id').on('submit', function(event) {
    // event.preventDefault();

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

    $.ajax({
        xhr: function() {
          var xhr = new window.XMLHttpRequest();

          xhr.upload.addEventListener("progress", function(evt) {
            var percent = Math.round(evt.loaded/evt.total * 100)
            console.log(percent)
            $('#complaint_query_button').attr('disabled', true)
            $('#complaint_query_button').get(0).innerText = "Upload status: " + percent + '%'
          }, false);

          xhr.upload.addEventListener("load", function(evt) {
            $('#complaint_query_button').css('background-color', 'green').delay(2000)
            $('#complaint_query_button').get(0).innerText = "COMPLETE, refreshing..."
            // setTimeout(location.reload.bind(location), 10000);

          }, false);

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

Приведенное выше решение сработало для меня как чудо, и у меня есть кнопка отправки, которая показывает прогресс загрузки в% s, однакоЯ думаю, я не совсем понимаю, что именно происходит со всем этим на месте. Я видел файлы, вложенные в файл ввода. Элементы HTML дважды загружаются в мое место назначения на сервере. Кроме того, процесс загрузки, указанный на кнопке отправки командой Ajax, не совпадает с информацией о ходе загрузки моего браузера.отображается в нижней левой части страницы.Я действительно смущен вышесказанным - я создаю 2 потока загрузки (один с Django, другой с Ajax)?Как я могу их примирить?Я открыт для предложений о том, как решить эту проблему, или, может быть, есть нативный модуль Django, который заботится о ходе загрузки файла?

Спасибо.

ОБНОВЛЕНИЕ 19 сентября 2018 Все еще не повезло, выяснив это.Буду признателен любому, кто найдет момент, чтобы поделиться своим мнением со мной.Извиняюсь за бесстыдное столкновение.

1 Ответ

0 голосов
/ 27 сентября 2018

Что ж, после большого пробного и ошибочного запуска этого вопроса, я наконец-то решил проблему - аргумент url пришлось изменить с "window.location.href" на "#", и все проблемы, которые я описал вышеостановился сразу.После добавления в функцию Page_query файла views.py ответа JSON в конце блока метода POST у меня появился веб-сайт, который выполняет передачу файлов и обновляет пользователя о состоянии загрузки без необходимости повторной визуализации послекаждая форма отправки.

Хотелось бы поучиться у кого-то более знающего, чем я, что на самом деле делает этот знак "#", так как это изменило правила игры для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...