2016-11-07 27 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

相關問題