2013-06-20 5 views
0

Я пытаюсь реализовать функцию ajax, которая будет выполнять запрос базы данных на основе значения id выпадающего списка.Не удалось выполнить проверку CSRF, несмотря на следующую документацию

HTML, из выпадающего списка

<form method = "POST" action="" >{% csrf_token %} 
    <select name = "parentorgs" id = "parentorgs"> 
    {% for org in parentorg_list %} 
     <option value = "{{org.parentorg}}" id = "{{org.parentorg}}" >{{ org.parentorgname }}</option> 
    {% endfor %} 
    </select> 
</form> 

JQuery change() функция используется для получения идентификатора выбора и передает его

function getData(id) { 
    $.ajax({ 
    type : "POST", 
    url : "getData/", 
    data : {"parentorg" : id}, 
    datatype: "json", 
    success : function(data) { 
     console.log(data) 
} 
    }); 
} 

, который в свою очередь вызывает функцию просмотра

from django.shortcuts import render_to_response, render 
from django.core.context_processors import csrf 

def getData(request): 
    c = {} 
    c.update(csrf(request)) 
    return render_to_response("app/index.html", c) 

Firebug показывает, что запрос проходит через POST , и URL метода действителен. Кроме того, URL-адрес этого метода был добавлен в urls.py.

На данный момент это не делает ничего, поскольку я просто хочу увидеть ответ от метода. Этот метод предназначен для выполнения модельного запроса и возврата результатов.

Каждый раз, когда в выпадающем списке выбирается элемент, я получаю сообщение об ошибке 403, описывающее, что в представлении используется ResponseContext, а не контекст для шаблона.

Что необходимо сделать для решения этой проблемы?

+0

что произойдет, если вы поместите в код 'печати request.POST'? –

+0

@VictorCastilloTorres, я получаю '[19/Jun/2013 21:28:11]" POST/app/getData/HTTP/1.1 "403 2294', когда это должно быть' parentorg: 28' – Jason

+0

У вас есть код js, который устанавливает заголовок в ваших запросах Ajax? https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax –

ответ

1

Согласно doc

Если вы используете render_to_response Джанго() ярлык для заполнения шаблона с содержимым словаря, ваш шаблон будет передан экземпляр контекста по умолчанию (не RequestContext) , Чтобы использовать RequestContext в рендеринг вашего шаблона, передайте необязательный третий аргумент render_to_response(): экземпляр RequestContext. Ваш код может выглядеть следующим образом:

from django.template import RequestContext 
def getData(request): 
    c = {} 
    c.update(csrf(request)) 
    return render_to_response("app/index.html", c, context_instance=RequestContext(request)) 
Смежные вопросы