使用AJAX调用在Django模板和视图之间发送信息时出现问题

时间:2019-06-20 21:16:06

标签: javascript python django ajax

我使用ajax发布请求将一些变量从我的javascript前端发送到python后端。一旦后端接收到它,我想修改这些值并将它们发送回前端显示。我需要全部完成而无需刷新页面。

使用我现有的代码,将值返回到前端会给我一个“空”或“ [对象对象]”响应,而不是实际的字符串/ json。我认为我传递的变量格式不正确,但是对于我来说,理解我到底在做什么错或需要修复的问题太复杂了。

这是模板中的javascript ajax POST请求。我希望成功功能使用警报显示新数据。

var arr = { City: 'Moscow', Age: 25 };

    $.post({
        headers: { "X-CSRFToken": '{{csrf_token}}' },
        url: `http://www.joedelistraty.com/user/applications/1/normalize`,
        data: {arr},
        dataType: "json",
        contentType : "application/json",
        success: function(norm_data) {
            var norm_data = norm_data.toString();
            alert( norm_data );
        }
    });

这是我接收请求的Django URLs代码:

path('applications/1/normalize', views.normalize, name="normalize")

这是用于检索代码并将其发送回javascript文件的python视图:

from django.http import JsonResponse

def normalize(request,*argv,**kwargs):
    norm_data = request.POST.get(*argv, 'true')
    return JsonResponse(norm_data, safe = False)

2 个答案:

答案 0 :(得分:1)

您需要将Object解析为实际的json字符串。 .toString()将仅打印对象toString()方法的实现,该方法是其字符串表示形式。默认情况下,对象仅通过调用toString()不会打印出其json格式。您可能正在寻找JSON.stringify(obj)

$.post({
headers: { "X-CSRFToken": '{{csrf_token}}' },
url: `http://www.joedelistraty.com/user/applications/1/normalize`,
data: {arr},
dataType: "json",
contentType : "application/json",
success: function(norm_data) {
    var norm_data = JSON.stringify(norm_data);
    alert( norm_data );
}});

答案 1 :(得分:0)

我观察到,表单发送的POST数据和此AJAX请求发送的POST数据之间存在差异。通过表单发送的数据将进行表单编码,而您发送的是原始JSON数据。使用request.body将解决问题

from django.http import JsonResponse

def normalize(request):
    data = request.body.decode('utf-8')
    #data now is a string with all the the JSON data.
    #data is like this now "arr%5BCity%5D=Moscow&arr%5BAge%5D=25"
    data = data.split("&")
    data = {item.split("%5D")[0].split("%5B")[1] : item.split("=")[1] for item in data}
    #data is like this now "{'City': 'Moscow', 'Age': '25'}"

    return JsonResponse(data, safe= False)