【问题标题】:How to get and access JSON data from ajax in django view?如何在 django 视图中从 ajax 获取和访问 JSON 数据?
【发布时间】:2016-02-08 07:29:03
【问题描述】:

我正在尝试使用 ajax 调用将动态创建的 JSON 数据从我的模板发送到视图。我能够通过 ajax 调用生成和传递 JSON 数据,但无法在视图中读取相同的数据。我阅读了很多关于此的文章和 stackoverflow 帖子,但对于这个简单的任务没有任何作用。下面是我的 Ajax 调用:

$(document).ready(function() {
    $('#applybtn').click(function(){
        var selectedpackages = [];
        {% for package in packages %}
            if($("input[name=package{{forloop.counter}}]").is(':checked')){
                type = $("input[name=package{{forloop.counter}}]:checked").attr('id');
                var Obj = {}
                Obj['pkgid'] = {{package.id}};
                Obj['type'] = type;
                selectedpackages.push(Obj);
            }
        {% endfor %}
        var mystring = JSON.stringify(selectedpackages);
        $.ajax({
            url:"/ApplyCode/",
            type:"GET",
            data:mystring,
            dataType: "json",
            contentType: "application/json",
            success: function(data){
                alert(data);
            }
        });    
    });
});

在上面给出的代码中,您可以忽略 for 循环部分,因为它只是遍历一些包并检查该页面上的用户选择了哪个包,并相应地生成一个字典以作为 JSON 对象传递。此外,我检查了 mystring 变量中生成的数据(使用 alert(mystring);),然后将其发送到查看,并且它具有所需的数据。

以下是我的观点的代码:

import json

def applycode(request):
    context=RequestContext(request)
    pkgid=""
    if request.method=='GET':
        selectedpackages = json.loads(request.body)
    else:
        pass
    return HttpResponse(selectedpackages)

我确定在“selectedpackages”变量中获取 JSON 数据时我在这里遗漏了一些东西。我也尝试了很多其他方法,但没有任何效果。在这里,我只想获取数据,而不是想要访问相同的每个元素。任何帮助表示赞赏。

【问题讨论】:

    标签: json ajax django django-views


    【解决方案1】:

    如果您发出GET 请求,request.body 将不会包含任何内容,这会将所有内容放在 URL 本身中。您需要更改您的 AJAX 调用以执行 POST

    $.ajax({
        // ...
        type:"POST",
        // ...
    });
    

    然后相应地修改您的视图代码:

    if request.method == 'POST':
        selectedpackages = json.loads(request.body)
    

    【讨论】:

    • 感谢您的回答。我也尝试了 POST 方法,但我在浏览器控制台中收到一些带有状态代码“HTTP/1.0 403 FORBIDDEN”的 http 错误。我在 urls.py 中添加的行是url(r'^ApplyCode/$', views.applycode, name='applycode'),。我在这里错过了什么吗?
    • 可能,我得到了解决方案。我需要在我的views.py 和applycode() 函数上方添加from django.views.decorators.csrf import csrf_exempt@csrf_exempt 以使其工作。谢谢!
    • 是的。另请参阅文档的this section
    • 但我想知道现在我的浏览器控制台中没有出现任何错误,但即使 applycode() 也没有正常运行。我无法从该功能中得到任何响应。我是否需要针对相同的方法采用不同的方法?我还参考了您提供的文档以找到解决方案..!!
    • @ParasBotadra 您需要将视图中的if request.method=='GET': 更改为if request.method=='POST':
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 2018-10-06
    • 2020-03-24
    • 2020-05-19
    • 2014-04-19
    • 2018-07-25
    • 1970-01-01
    相关资源
    最近更新 更多