Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 如何在Django中正确执行AJAX请求_Jquery_Django - Fatal编程技术网

Jquery 如何在Django中正确执行AJAX请求

Jquery 如何在Django中正确执行AJAX请求,jquery,django,Jquery,Django,我在模板中制作了一个带有{%csrf\u token%}标记的表单,表单输出如下: <form id="appl_detail13" action="/13/devices/" method="post"> <input type="hidden" name="csrfmiddlewaretoken" value="gTOpBTi6rljV5dKsGE0kuzD1IkghAlzW7GdiBZw6pMMaMUxJSlVev5YqPef6jhjb"> <

我在模板中制作了一个带有
{%csrf\u token%}
标记的表单,表单输出如下:

 <form id="appl_detail13" action="/13/devices/" method="post">
    <input type="hidden" name="csrfmiddlewaretoken" value="gTOpBTi6rljV5dKsGE0kuzD1IkghAlzW7GdiBZw6pMMaMUxJSlVev5YqPef6jhjb">
   <input name="appl_checkbox" id="5" type="checkbox" class="form-check-input applcheck" value="13"> 
</form>
Url映射器:

urlpatterns = [
    # ex: /13/devices/
  path('<int:application_id>/devices/', views.ApplicationDetail, name='application-detail'),
]
因此,我得到以下错误:


另外,我知道有很多关于这方面的教程,但其中很多都过时了,并且有断开的链接。

您需要在ajax调用的标题中添加CSRF试试这个-

(function() {
  $.ajaxSetup({
      headers: { "X-CSRFToken": getCookie("csrftoken") }
  });

  function getCookie(c_name)
  {
  if (document.cookie.length > 0)
  {
      c_start = document.cookie.indexOf(c_name + "=");
      if (c_start != -1)
      {
          c_start = c_start + c_name.length + 1;
          c_end = document.cookie.indexOf(";", c_start);
          if (c_end == -1) c_end = document.cookie.length;
          return unescape(document.cookie.substring(c_start,c_end));
      }
  }
  return "";
  }
}());

您需要在ajax调用的头中添加CSRF,请尝试以下操作-

(function() {
  $.ajaxSetup({
      headers: { "X-CSRFToken": getCookie("csrftoken") }
  });

  function getCookie(c_name)
  {
  if (document.cookie.length > 0)
  {
      c_start = document.cookie.indexOf(c_name + "=");
      if (c_start != -1)
      {
          c_start = c_start + c_name.length + 1;
          c_end = document.cookie.indexOf(";", c_start);
          if (c_end == -1) c_end = document.cookie.length;
          return unescape(document.cookie.substring(c_start,c_end));
      }
  }
  return "";
  }
}());

如果您从表单调用,那么发送Ajax请求的方式并不完全相同(因为它会加载页面)

以下是使用csrf发送ajax请求的方式:

$.ajax({
      type: "GET",
      url: "/13/devices/",
      beforeSend: function (xhr) {
        xhr.setRequestHeader('X-CSRFToken', '{{csrf_token}}');
      },
      success: function (data) {
        console.log(data);
      }
如果您想让javascript文件接受Django,只需在javascript中声明全局变量(在您的模板
script
tag
中,在导入带有ajax请求的javascript之前):


如果您从表单调用,那么发送Ajax请求的方式并不完全相同(因为它会加载页面)

以下是使用csrf发送ajax请求的方式:

$.ajax({
      type: "GET",
      url: "/13/devices/",
      beforeSend: function (xhr) {
        xhr.setRequestHeader('X-CSRFToken', '{{csrf_token}}');
      },
      success: function (data) {
        console.log(data);
      }
如果您想让javascript文件接受Django,只需在javascript中声明全局变量(在您的模板
script
tag
中,在导入带有ajax请求的javascript之前):



我有请看我的输入与类型隐藏,它的输出工作,但为什么这必须是那么复杂?我也在等待其他答案,这并不复杂。如果javascript在模板中,则可以使用模板变量
{{csrf_token}}
设置头。如果您的javascript位于单独的文件中,则会显示。您不能使用模板语言,必须从cookie中获取它。getCookie函数是通用的,可以用于许多其他脚本。或者,如果您的js位于自己的文件中,您也可以获取表单的隐藏输入字段的值,正如我所解释的。请使用类型hidden查看我的输入,这是输出,但为什么会如此复杂?我也在等待其他答案,这并不复杂。如果javascript在模板中,则可以使用模板变量
{{csrf_token}}
设置头。如果您的javascript位于单独的文件中,则会显示。您不能使用模板语言,必须从cookie中获取它。getCookie函数是通用函数,可用于许多其他脚本,您可以按说明获取表单隐藏输入字段的值我看不到您在哪里声明
requestUrl
我添加了一个虚拟示例我看不到您在哪里声明
requestUrl
我添加了一个虚拟示例我不需要
{%csrf\u token%
在我的表单中?是的,csrf只是由django cookie或Session生成的一个随机令牌。此解决方案仅在该javascript是html模板的一部分时有效。如果通过
src=…
包含脚本,它将不起作用。这是将django变量传递给javascript的问题,我已将其放入编辑的答案中,我不需要
{%csrf\u token%
在我的表单中?是的,csrf只是django cookie或Session生成的一个随机令牌。此解决方案仅在该javascript是html模板的一部分时有效。如果通过
src=…
包含脚本,它将不起作用。这是将django变量传递给javascript的问题,我在编辑的答案中加入了该javascript
<script>
   var csrfToken = {{ csrf_token }};
</script>
beforeSend: function (xhr) {
   xhr.setRequestHeader('X-CSRFToken', csrfToken);
},