Django 中的 Ajax 正在创建重复元素

Posted

技术标签:

【中文标题】Django 中的 Ajax 正在创建重复元素【英文标题】:Ajax in Django is creating duplicate elements 【发布时间】:2021-10-26 09:21:54 【问题描述】:

我有一个表单,它在提交时会使用 Plotly 创建一个图表。我正在尝试使用Ajax 在不刷新页面的情况下提交表单。当表单提交成功时,表单 div 会在屏幕上复制。我不知道如何纠正这个问题。我正在使用 Django Web 框架。这是我的代码。

模板

<form action="% url 'home' %" method='post' id='year-form'>
    % csrf_token %

    <select class="form-select form-select-lg mb-3 dropdown-btn" aria-label="Default select example"
        name="year">
        <option selected>Select Year</option>
        <option value="2017">2017</option>
        <option value="2018">2018</option>
        <option value="2019">2019</option>
        <option value="2020">2020</option>
    </select>

    <div class="d-grid gap-2">
        <button class="btn btn-primary btn-lg" type="submit">Button</button>
    </div>
</form>
<div id="message"></div>

<div class="graph center" id='graph'>
    % if graph %
     graph.0|safe 
    % else %
    <p>No graph was provided.</p>
    % endif %
</div>

ajax jQuery

<script type="text/javascript">
    var frm = $('#year-form');
    frm.submit(function () 
        $.ajax(
            type: frm.attr('method'),
            url: frm.attr('action'),
            data: $(this).serialize(),
            success: function (data) 
                $("#graph").html(data);
            ,
            error: function (data) 
                $("#message").html("Something went wrong!");
            
        );
        return false;
    );
</script>

这是提交表单之前页面的样子

这是提交表单后的样子

我认为我没有在 Ajax 调用的 success 部分提供正确的数据。

【问题讨论】:

【参考方案1】:

您应该使用不同的端点/视图来返回图形模板。目前,您正在获取当前页面并再次加载它,但这次使用的是图表。

您的主页模板应该是:

<form action="% url 'home' %" method='post' id='year-form'>
    % csrf_token %

    <select class="form-select form-select-lg mb-3 dropdown-btn" aria-label="Default select example"
        name="year">
        <option selected>Select Year</option>
        <option value="2017">2017</option>
        <option value="2018">2018</option>
        <option value="2019">2019</option>
        <option value="2020">2020</option>
    </select>

    <div class="d-grid gap-2">
        <button class="btn btn-primary btn-lg" type="submit">Button</button>
    </div>
</form>
<div id="message"></div>

<div class="graph center" id='graph'>
    <p>No graph was provided.</p>
</div>

然后,您在另一个视图中使用了第二个模板,您可以通过 ajax 获得这样的图表:

% if graph %
     graph.0|safe 
% else %
    <p>No graph was provided.</p>
% endif %

【讨论】:

感谢您的回复。但是有不同的观点会把我带到不同的页面,对吗?如何在同一页面中呈现图表? 您使用的是ajax,所以您应该没有这个问题,如果这样做,请尝试添加frm.submit(function (e) =&gt; e.preventDefault() ... 以停止表单提交和发布视图 你能解释一下吗?您的解决方案以前有效,但我现在再次面临这个问题。我正在尝试添加更多图表,但它停止工作

以上是关于Django 中的 Ajax 正在创建重复元素的主要内容,如果未能解决你的问题,请参考以下文章

django ajax请求响应[重复]

Django AJAX 请求仅获取最后一个元素(不是 getlist 问题)

在不重新加载页面的情况下更新 Django 中的表单值?

根据 DJango/Ajax 中的第一个选定下拉菜单创建下拉选择

从 Django 中的 JsonResponse 中提取字段值并将其传递给 Ajax Jquery

jQuery.ajax - 提交表单中的所有元素而不手动输入它们[重复]