【问题标题】:AJAX not updating database query as intendedAJAX 未按预期更新数据库查询
【发布时间】:2018-09-26 20:30:14
【问题描述】:

我的页面同时使用 django 上下文变量和 json 数据。第一页是仅显示所有可用数据的“母版页”。然而,其他页面是在提交下拉表单时加载的,用户可以在其中选择要查看的特定帐户。当用户选择一个帐户并提交下拉表单时,会发生两件事:

表单操作转到 django 视图函数,该函数对数据库进行多次查询,然后在呈现模板时传递上下文变量。接下来,图表数据应该通过 Ajax 从某个返回 JSONResponse 数据的 URL 加载。图表数据似乎可以很好地加载“主”页面,因为当我访问发送数据的 url 时会显示所有数据。但是,在选择特定帐户后,我想将请求传递给 url 以根据选择过滤数据库,从而生成特定的图表数据。这是似乎不起作用的部分,因为当我选择特定帐户时,我似乎无法获取仅显示该特定帐户的图表数据。这是我的代码:

urls.py

from django.conf.urls import url, include
from . import views
from .views import get_master_data, get_specific_data

views.py

### SELECTED METER DATABASE DATA PULL ###
def get_specific_data(request, *args, **kwargs): ### This isn't working as intended ###

if request.method == 'POST':

    selected_meter = request.POST.get('selected_meter')

    usage_data = list(MeterData.objects.filter(name=selected_meter).order_by('date').values_list('usage', flat=True))
    #### A bunch of other similar queries ####

    data = {
        "usage_data": usage_data,
        #### corresponding parts for other queries not shown ####
    }
    return JsonResponse(data)

else:

    usage_data = list(MeterData.objects.order_by('date').values_list('usage', flat=True))
    ##### A bunch of other similar queries #####

    data = {
        "usage_data": usage_data,
        #### corresponding parts for other queries not shown ####
    }
    return JsonResponse(data)

模板.html

// This script is what gets the chart data. This works on the master page //
<script>
    var categories = [];
    var data = [];
    var endpoint = '/properties/api/chart/data/'
    $.ajax({
        method: "GET",
        url: endpoint,
        success: function(data){
            categories = data.dates
            usageData = data.usage_data
            OldCostsData = data.oldCosts_data
            NewCostsData = data.newCosts_data
            OldRatesData = data.oldRates_data
            NewRatesData = data.newRates_data
            savingsData = data.savings_data
            Chart.defaults.global.defaultFontFamily = "Gotham-Black";
            var usageCanvas = document.getElementById("usageChart");
            var ratesCanvas = document.getElementById("ratesChart");
            var costsCanvas = document.getElementById("costsChart");
            var savingsCanvas = document.getElementById("savingsChart");
        }
    });
</script>

// This is supposed to post the dropdown menu selection on submission before loading the new template thus querying specific chart data //
<script>
    var meterForm = $('#property-select');
    var specificDataUrl = '/properties/api/specific-chart/data/';
    meterForm.submit(function(event){
        event.preventDefault();
        $.ajax({
            type: "POST",
            url: specificDataUrl,
            data: { selected_meter: $('#property-select option:selected').val() }, // data to be sent with the post request

            success: function(data) {
                console.log(data)
            },
        });
    });;
</script>


<!-- This is the form -->
    <form method="POST" action="/properties/property-selected/" id="property-select">
            {% csrf_token %}
            <select name="meters" class="dropdown-content">
                {% for meter in user_meters %}
                <option value="{{ meter }}">{{ meter.name }}</option>
                {% endfor %}
            </select>
            <input type="submit" value="Submit" class="submit-button" style="margin-top:30px;"/>
    </form>

我不太确定为什么图表数据的特定数据查询不起作用。任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 这里的代码太多了。请将其减少到证明问题所需的最低限度。
  • @DanielRoseman 我按要求更新了代码,对此感到抱歉。提交的时候感觉好多了,这个应该会更好。

标签: javascript html css ajax django


【解决方案1】:

在您的 Javascript 中,您使用名为 selected_meter 的参数发布请求:

data: { selected_meter: $('#meter-option').val() }

但您的视图要求一个名为 selection 的 post 参数:

selected_meter = request.POST.get('selection')

更新您的视图或 Javascript 以使参数名称相同,例如

selected_meter = request.POST.get('selected_meter')

【讨论】:

  • 好收获!我已经进行了这个更改,并将我的 ajax 代码中的 POST 用引号括起来,尽管这似乎并没有解决问题。
  • 开个玩笑,修复了一些语法错误,虽然它似乎还没有工作,但我在控制台中收到 403 错误(可能与需要传递 csrf 令牌有关)。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
相关资源
最近更新 更多