尽管有以下文档,但CSRF验证失败

时间:2013-06-20 02:21:07

标签: django django-csrf

我正在尝试实现一个ajax函数,该函数将根据下拉选择的id值执行数据库查询。

下拉列表的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有效。此外,此方法的URL已添加到urls.py。

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

每次在下拉列表中选择一个项目时,我都会收到一个错误403,描述视图使用ResponseContext而不是Context用于模板。

解决此问题需要做些什么?

1 个答案:

答案 0 :(得分:1)

根据doc

  

如果您正在使用Django的render_to_response()快捷方式使用字典的内容填充模板,则默认情况下将为您的模板传递一个Context实例(而不是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))