csrf_token找不到django ajax

时间:2016-11-15 13:42:04

标签: jquery ajax django django-csrf

<script>
    function post(e) {
        data = $("#form_add_post").serialize();
        $.post( "/post/", function( data ) {
                alert("posted");
        });
        return false;
    }
    function addPost(){
    $(".matter").html("<form id='form_add_post' onsubmit='return post(event);'>{% csrf_token %} <table> <tr> <td class='heading'>Title: </td> <td class='box'><input type='text' name='title'></td> </tr> <tr> <td colspan='2'><textarea class='data' name='content'></textarea></td> </tr> </table> <input id='submitt1' type='submit'> </form>");
}
</script>

我正在尝试执行AJAX后调用。我也放了csrf_token。我已经交叉检查了正在发送的数据。它显示了包括csrf_token在内的所有细节 我的数据:

  

csrfmiddlewaretoken = foYqu9LrR25AomOmcFkaEicmN3CU2wcRNVg1gRPgl2F9XfL6IWerpbSK6TUKd4Ke&安培;标题=测试仪及安培;含量= hhgj%3B%3Bhghjbjn

但我收到403错误显示

  

CSRF验证失败。请求中止。

Image showing the error

3 个答案:

答案 0 :(得分:1)

尝试以这种方式提出请求

$.ajax({
        type:form.attr('method'),
        url:form.attr('action'),
        data:form.serialize(),
        success: function(){
          ...
        }
      });

答案 1 :(得分:0)

根据Laravel Docs,您应该在Ajax请求中添加CSRF令牌,如下所示:

HTML代码:

<meta name="csrf-token" content="{{ csrf_token() }}">

JS代码:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});
  

如果是Django - 您需要添加{% csrf_token %}模板   标记为Django模板中表单元素的子元素。看到这个 -   Question

希望这有帮助!

答案 2 :(得分:0)

您正在正确呼叫$.post。如果您在开发人员工具中查看请求,我认为您会看到帖子数据为空。

第二个参数应该是请求数据,第三个参数是success回调。

$.post("/post/",
       data,
       function (response_data) {
         alert("posted");
       }
);

一旦你修复了它,the Django docs显示了如何在ajax请求中包含CSRF令牌作为标题,因此你不必将它包含在表单体中。