8

我有这样的代码:

$(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");
            }
        });
    });
});

并在 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())

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

4

6 回答 6

20

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

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

在 Django 中,您必须返回包含数据的 json 序列化字典。content_type 必须是application/json. 在这种情况下,不推荐使用 locals 技巧,因为可能某些局部变量无法在 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())

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

于 2013-02-01T08:43:13.180 回答
9

如何创建 dict 并解析为 json:

name = request.POST.get('name')
dict = {'name':name}
return HttpResponse(json.dumps(dict), content_type='application/json')
于 2013-02-01T08:20:31.530 回答
2

你有一个错字:

    success: function(resp){
        alert ("resp");
    }

应该

        success: function(resp){
            alert (resp);
        }

此外,关于 csrf,您必须使用如下标头:

    $.ajax({
            url: "some-url",
            headers: {'X-CSRFToken': '{{ csrf_token }}'},
于 2016-06-09T19:19:01.383 回答
1

只需这样做......(Django 1.11)

from django.http.response import JsonResponse

return JsonResponse({'success':False, 'errorMsg':errorMsg})

当您在 jQuery 中处理 json 部分时,请执行以下操作:

$.ajax({
    ...
    dataType: 'json',
    success: function(returned, status, xhr) {
        var result = returned['success']; // this will be translated into 'true' in JS, not 'True' as string
        if (result) { 
            ...
        else {
            ...
        }
    }
});
于 2018-03-15T11:23:45.887 回答
0
$(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': name, 
                'csrfmiddlewaretoken': '{{csrf_token}}'
            }, 
            contentType: "application/json;charset=utf-8",
            dataType: "json",
            success: function(data) { 
                alert(data);
            },
            error: function(ts) { 
                alert(ts);
            }
        });
    });
});


def lat_ajax(request):
    if request.POST:
        name = request.POST['name']
        return HttpResponse(name)
    else :
        return render_to_response('ajax_test.html',locals())
于 2013-02-01T12:03:48.927 回答
0

如果没有任何效果,请将“@csrf_exempt”放在您的函数之前

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def lat_ajax(request):
"""
your code
"""
于 2013-04-26T09:05:09.960 回答