2013-06-20 27 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()函数用于获得所述选择的ID,并将其传递到

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有效。此外,此方法的网址已添加到urls.py.

在这个时候,它没有做任何事情,因为我只是想看到方法的反应。此方法旨在执行模型查询并返回结果。

每次在下拉列表中选择一个项目时,都会出现错误403,说明该视图使用ResponseContext而不是模板的Context。

需要做些什么来解决这个问题?

+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

如果你使用Django的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))