6

我有以下 ajax 调用来更新模型的特定字段

$("#updateLink").click(function(){
    var dec_text = $('#desc_text').val();

    $.ajax({
        type: "POST",
        url:"/users/update_desc/",
        data: {
        'val': dec_text,
        },
        success: function(){
            $(".display, .edit").toggle();
            $("#descText").html(dec_text);
        },
        error: function(){
            alert("Error");
        },
    });
    return false;
});

我的看法是这样的

@csrf_exempt
def update_desc(request):
    if request.is_ajax():
        if request.method == 'POST':
            desc_text = request.POST.get('val', False)
            if desc_text:
                profile = user.profile
                profile.desc = desc_text
                profile.save()

            return_message = "Sent mail"
            return HttpResponse(return_message,mimetype='application/javascript')

我不断收到一条错误消息,我不知道如何解决这个问题。csrf_exempt如果问题是由丢失引起的,我什至使用装饰器来解决问题,csrf token但问题仍然存在。

除了ajax post在我的base模板中所有 ajax 调用都失败的那个。任何人都可以帮助了解这里发生的事情。如果需要,我可以提供更多细节。

编辑:

我在基本模板中添加了js包含此https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax的文件,因此这意味着它存在于我的所有模板中。我正在使用 django 1.3 版本。

4

1 回答 1

6

首先,您使用的是 POST 而不是发送csrf token。尝试显式发送 csrf 令牌而不是使用装饰器csrf_exempt一种方法是使用我在data
中所做的。那就是获取 csrf 令牌(或从您自己的方法)并将其传递给您的参数。

$.ajax({
        url : url,
        type: "POST",
        data : {csrfmiddlewaretoken: document.getElementsByName('csrfmiddlewaretoken')[0].value},
        dataType : "json",
        success: function( data ){
            // do something
        }
    });
于 2011-12-30T07:51:14.470 回答