Django从按钮调用函数,同时停留在同一页面上

时间:2016-11-07 15:05:02

标签: python django

我有一个动态创建的表,其中包含来自django模型的数据。此表显示有关每个data_element的其他信息。

在最后一栏中应该

  • 是为每行显示的按钮,它将使用该特定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 }}>

如果脚本仍在运行,我现在如何动态更改按钮?

2 个答案:

答案 0 :(得分:1)

您需要一种方法来启动异步任务,以及获取任务状态的方法,然后添加一些js / ajax代码来启动任务并相应地更新您的表。

对于前两部分,规范解决方案是celery

答案 1 :(得分:0)

另一种不太推荐的方法(不太推荐,但可能比芹菜更容易设置)只需spawn a child, detached process即可在后台完成工作并将状态和结果存储在某处(例如在您的位置)数据库或像redis这样的内存存储。

主要的缺点是你无法控制子进程中发生的事情。根据您的项目 - 如果您不关心过程控制 - 它可能会成为更好的解决方案。