2016-11-07 3 views
0

У меня динамически созданная таблица с данными из модели django. В этой таблице отображается дополнительная информация о каждом элементе data_element.Функция вызова Django с кнопки, оставаясь на той же странице

В последнем столбце должны либо

  • быть кнопка отображается для каждой строки, которая будет запускать скрипт с дополнительными ключевыми словами из этого конкретного data_element, без перезагрузки или замораживания страницы.
  • Если сценарий все еще работает (может занять несколько часов) должен быть значок прогресс отображается и
  • если сценарий уже закончен, там должна быть кнопка отображается, перенаправляя на results.html

Как я могу запрограммировать это с помощью django? В настоящее время я выполняю скрипт вручную, но для этого я перенаправляю на другой шаблон с аргументами для анализа и при выполнении сценария (с помощью call_command ('my_script', * args) страница замерзает до окончания скрипта.

<form action="{% url 'calculate' element_id %}"> 
 
    <input class="btn btn-primary-custom" id="submit" type="submit" value="run script"> 
 
</form>

Я попытался вставить код с этого поста: Django button ajax click

Но когда я нажимаю на эту кнопку ничего не происходит Что мне нужно сделать, чтобы создать эту таблицу.?

EDIT функция для моей кнопки в настоящее время выглядит следующим образом:

$(document).ready(function(){ 
    $('.calculate-btn').bind('click', function(){ 
     function getCookie(name) { 
     var cookieValue = null; 
     if (document.cookie && document.cookie != '') { 
      var cookies = document.cookie.split(';'); 
      for (var i = 0; i < cookies.length; i++) { 
       var cookie = jQuery.trim(cookies[i]); 
       // Does this cookie string begin with the name we want? 
       if (cookie.substring(0, name.length + 1) == (name + '=')) { 
        cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
        break; 
       } 
      } 
     } 
     return cookieValue; 
    } 

    var btn-data= $(this).attr('btn-data'); 
    var csrftoken = getCookie('csrftoken'); 
     $.ajax({ 
     type: 'POST', 
     url : "/run/", 
     dataType: "html", 
     data : {'csrfmiddlewaretoken': csrftoken, 'btn-data':btn-data}, 
     success: function(data, status, xhr){ 
      console.log("SUCCESS") 
     }, 
     error: function(data, status, xhr){ 
      console.log("ERROR") 
     } 
     }); 

     return false; 
    }); 
}); 

и мой взгляд вызывается из кнопки мыши:

<input id="{{item.id}}" class='calculate-btn' name="update_log" type="button" value="Run Script" btn-data={{ item.id }}> 

Как я теперь динамически изменять кнопку , пока скрипт все еще работает?

ответ

1

Вам понадобится способ запуска асинхронных задач и способ получить статус задачи, а затем добавить довольно некоторый код js/ajax для запуска задачи и соответственно обновить таблицу.

Для первых двух частей каноническое решение - celery.

0

Другой, менее рекомендуемый способ сделать это (менее рекомендуется, но, вероятно, проще настроить, чем сельдерей) - это просто spawn a child, detached process, который выполнит задание в фоновом режиме и сохранит статус и результаты где-нибудь (например, в вашей базе данных или в память, например redis).

Главное disadventage состоит в том, что вы теряете контроль над тем, что происходит в дочернем процессе. В зависимости от вашего проекта - если вы не заботитесь о контроле процесса - это может оказаться лучшим решением.

+0

Мне не нужно управлять процессом, пока пользователь не может запустить сценарий еще раз, пока он уже запущен. Как я могу порождать ребенка для этой конкретной строки, не выходя из страницы? – Ali

+0

Итак, я запускаю свой скрипт с помощью 'subprocess.Popen (['python', 'my_script.py', args])'. Я могу проверить внутри этого скрипта python, используя '.pool()', если он закончен, но как я могу проверить это динамически на веб-сайте, когда пользователь просматривает? – Ali

Смежные вопросы