如何在Django中响应ajax请求

Cit*_*ozz 7 python django

我有这样的代码:

$(document).ready(function(){
    $('#error').hide();
    $('#submit').click(function(){
        var name = $("#name").val();
        if (name == "") {
            $("#error").show("slow");
            return false;
        }
        var pass = $("#password").val();
        if (pass == "") {
            $("#error").show("slow");
            return false;
        }
        $.ajax({
            url: "/ajax/",
            type: "POST",
            data: name,
            cache:false,
            success: function(resp){
                alert ("resp");
            }
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

并在Django中查看:

def lat_ajax(request):
    if request.POST and request.is_ajax:
        name = request.POST.get('name')
        return HttpResponse(name)
    else :
        return render_to_response('ajax_test.html',locals())
Run Code Online (Sandbox Code Playgroud)

我的错误在哪里?我是Django的初学者,请帮助我.

luc*_*luc 15

放入dataType: "json"jquery调用.resp将是一个javascript对象.

$.ajax({
    url: "/ajax/",
    type: "POST",
    data: name,
    cache:false,
    dataType: "json",
    success: function(resp){
        alert ("resp: "+resp.name);
    }
});
Run Code Online (Sandbox Code Playgroud)

在Django中,您必须返回包含数据的json序列化字典.content_type必须是application/json.在这种情况下,不建议使用本地技巧,因为有些局部变量可能无法在json中序列化.这会引发例外.请注意,这is_ajax是一个功能,必须调用.在你的情况下,它将永远是真的.我也会测试request.method而不是request.POST

import json
def lat_ajax(request):

    if request.method == 'POST' and request.is_ajax():
        name = request.POST.get('name')
        return HttpResponse(json.dumps({'name': name}), content_type="application/json")
    else :
        return render_to_response('ajax_test.html', locals())
Run Code Online (Sandbox Code Playgroud)

更新:如Jurudocs所述,csrf_token也可能是我推荐阅读的原因:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax


Luk*_*ara 6

如何创建dict并解析为json:

name = request.POST.get('name')
dict = {'name':name}
return HttpResponse(json.dumps(dict), content_type='application/json')
Run Code Online (Sandbox Code Playgroud)