如何在 django 中使用 ajax 更新绘图图

Posted

技术标签:

【中文标题】如何在 django 中使用 ajax 更新绘图图【英文标题】:how to update plotly graph using ajax in django 【发布时间】:2021-03-24 04:45:24 【问题描述】:

我想在我的 Django 项目中使用 ajax 更新我的绘图图。这是我到目前为止所尝试的。 我正在按照this 指南进行操作,而且我对 jquery 和 ajax 完全陌生。

urls.py

urlpatterns = [
    path('', views.index, name='index'),   
    path('smartflow/ajax/updategraph', views.updategraph, name = "updategraph")

]

views.py 中,我定义了一个 updategraph 函数(视图)来完成 GET 请求的工作。

def updategraph(request):        
    df_georgian = get it from a csv file for example

    if request.headers.get('x-requested-with') == 'XMLHttpRequest':
            coding = request.GET.get('coding')

            if coding:
                    trace2 = go.Scatter(x=df_georgian.index,
                                            y=df_georgian.loc[:, df_georgian.columns[2]],
                                            mode='lines',
                                            name='2')


                    fig_new = go.Figure(data=[trace2])
                    plot_div_new = plot(fig_new,
                                            config=config,
                                            output_type='div')

                    data = 
                            'my_data':plot_div_new
                    
                    return JsonResponse(data)
    else:
            return redirect('smartflow')

这是我的模板:

<div class="container">

    <div class="row">
        <div class="col-12 col-sm-12 col-md-12 col-lg-12 col-xl-12 mx-3 px-0 mt-5 pt-5" id="graph" >
            % autoescape off %
             new|safe 
            % endautoescape %
        </div>

        <div class="col-12">

            <div>
                <input type="checkbox" id="coding" name="interest" value="coding" onclick = "myfunction()">
                <label for="coding">Coding</label>
            </div>

        </div>

    </div>
</div>

我希望,如果选中了coding 复选框,则图表会将trace2 添加到自身,当取消选中时,trace2 将从现有图表中删除。

这是我的 jquery 来响应模板末尾的 GET 请求:

<script type = "text/javascript">
    $("#coding").change(function () 
    if (document.getElementById('coding').checked) 
        alert("checked");
        
        var current_graph = $('#graph').val();

        $.ajax(
            url: "% url 'updategraph' %",
            data: 
                'current_graph': current_graph
            ,
            dataType: 'json',

            success: function (data) 
            // $('#graph').val() = current_graph; //Here is my question?!?!?!?!?!??!?!?!?!
                alert(response);

            
        );
        
     else 
        alert("unchecked");
    
  
);

当我选择 coding 时,我在 chrome 控制台中收到以下错误:

GET http://127.0.0.1:8000/smartflow/ajax/updategraph?current_graph= 500 (Internal Server Error)         jquery-3.5.1.min.js:2 
send    @   jquery-3.5.1.min.js:2
ajax    @   jquery-3.5.1.min.js:2
(anonymous) @   (index):1683
dispatch    @   jquery.min.js:2
v.handle    @   jquery.min.js:2

在我的js代码的成功函数中($('#graph').val() = data; //这是我的问题?!​​?!?!?!?!??!?!?!? !) 部分:

1- 我不知道如何获取我在views.py 中返回的my_data 并将其放入具有#graph id 的div 中。

2- 如何将数据添加到当前图表而不删除以前的图表。

【问题讨论】:

您好,当您聚焦复选框未点击提交按钮时,您的事件将被调用。做一件事,您可以检查复选框查看您的network tab-&gt;XHR 查看您的ajax 请求详细信息。此外,将alert(response) 放入成功函数中,看看这是否显示以及它带来了什么。 @Swati 你是对的,我的事件不对。我更新了问题,我还更新了事件并使用alert 对其进行了测试,它工作得很好,但是alert(response); 什么也没显示,这是否意味着我的 ajax 调用没有发生? 它发生了,但是你有服务器错误。在这里,#graph 不是 div 输入,我认为您需要传递复选框值,只需使用 $(this).val() 获取它。另外,您使用 request.GET.get('coding') 从 ajax 获取价值 .. 那不应该是 request.GET.get('username') 吗?跨度> @Swati network tab-&gt;XHR 中的请求状态为500。所以我的ajax请求没有发生,我做错了什么? @Swati 我的错,我忘记更新变量名称了。请再次检查代码。我使用#graph 来获取当前图形,然后将从ajax 接收到的数据添加到其中。 #coding 是复选框的 id,ajax 调用有什么要保存的吗? 【参考方案1】:

您的评论在哪里:

$('#graph').html(data["current_graph"])

【讨论】:

以上是关于如何在 django 中使用 ajax 更新绘图图的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Ajax 在 Django 中更新 modelForm

上传文件后,如何在 Django 中使用 AJAX 更新表(与 JavaScript 链接)?

在 Django 中使用 AJAX 更新数据库

如何在 django ajax 更新中返回 json 字典

如何更新绘图表达树状图以同时具有标签和绘图内的值?

Django 使用来自 Ajax 的成功数据更新模板 div