2016-11-07 120 views
0

我有一个动态创建的表与Django模型的数据。此表显示有关每个data_element的附加信息。从按钮Django调用函数,同时停留在同一页

在最后一栏有要么

  • 对于每一行显示一个按钮,将运行与该特定data_element其他关键字的脚本,而不需要重新装载或冻结页面。
  • 如果脚本仍在运行(可能需要几个小时),应该有进度图标显示和
  • 如果脚本已经完成,应该有显示的按钮,重定向到一个results.html

我怎样才能用django编程? 目前我正在手动执行脚本,但为此,我将其重定向到另一个模板,并使用args进行解析,并在执行脚本时(使用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

但是当我点击该按钮,没有任何反应我有什么做的,创建该表?

编辑 我的按钮的功能目前看起来是这样的:

$(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])''运行脚本。如果完成,我可以使用'.pool()'检查该Python脚本,但是如何在网站上动态检查该脚本,而用户正在浏览? – Ali

相关问题