Ошибка вызова Ajax в Django - PullRequest
       22

Ошибка вызова Ajax в Django

6 голосов
/ 30 декабря 2011

У меня следующий 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 не выполняются. Может кто-нибудь, пожалуйста, помогите понять, что здесь происходит. Я могу дать более подробную информацию, если потребуется.

Edit:

Я добавил файл js, содержащий этот https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax, в свой базовый шаблон, так что это означает, что он присутствует во всех моих шаблонах. И я использую версию Django 1.3.

1 Ответ

6 голосов
/ 30 декабря 2011

Во-первых, вы используете POST и не отправляете токен csrf . Попробуйте явно отправить токен csrf, а не использовать декоратор csrf_exempt .
Один из способов сделать это с тем, что я сделал в data . То есть получить токен csrf (или из вашего собственного метода) и передать его в аргументах.

$.ajax({
        url : url,
        type: "POST",
        data : {csrfmiddlewaretoken: document.getElementsByName('csrfmiddlewaretoken')[0].value},
        dataType : "json",
        success: function( data ){
            // do something
        }
    });
...