【问题标题】:Django view not getting ajax requestDjango视图没有收到ajax请求
【发布时间】:2021-05-03 19:12:29
【问题描述】:

我的模板中有一个脚本,它尝试在 onbuttonclick 事件期间将数据发送到 django 视图。我的问题是该请求似乎没有进入视图。浏览器控制台可以正确地看到请求,但是当我调用 request.is_ajax() 时,django 视图甚至不返回 true。

request.method 返回 GET 而不是 POST,并且数据为空。无论请求类型如何,此行为都是持久的。

html

<a onclick="setGetParameter(this)" pid="some_id">Some Text</a>

.js

<script>
  var csrftoken = Cookies.get('csrftoken');

  function setGetParameter(el){

      var stuff = $(el).attr('pid');

      $.ajax({
        type: 'POST',
        headers: { "X-CSRFToken": csrftoken },
        url: '/view_url/',        
        data: {'datatopass': stuff},
        success: function(response){
          alert(response);
        }
      });
  }
  </script>

urls.py

path('view_url/', views.test),
path('', views.home),

views.py

def test(request): 
    output = request.is_ajax()
    return HttpResponse(output)

【问题讨论】:

    标签: python django ajax web-deployment


    【解决方案1】:

    经过几天的努力,我选择了不同的实现方式。看来我只能在最初发送请求的页面上呈现数据。

    【讨论】:

      【解决方案2】:

      在 Django 3.1 中,is_ajax() 方法已被弃用。见Miscellaneous Django 3.1

      所以对于 Django >= 3.1 你可以这样做:

      if request.headers.get('x-requested-with') == 'XMLHttpRequest':
          is_ajax = True
      else:
          is_ajax = False
      

      并确保在 AJAX 请求标头中添加以下行:

      "X-Requested-With": "XMLHttpRequest"
      

      我会使用 jQuery click 方法:

      <a pid="some_id">Some Text</a>
      
      <script>
      var csrftoken = Cookies.get('csrftoken');
      
      function setGetParameter(el){
      
          var stuff = $(el).attr('pid');
      
          $.ajax({
              type: 'POST',
              headers: { "X-CSRFToken": csrftoken },
              url: '/view_url/',        
              data: {'datatopass': stuff},
              success: function(response){
                  alert(response);
              }
          });
      }
      
      $(document).ready(function(){
          $('a[pid]').click(function(){
              setGetParameter(this);
          });
      });
      </script>
      

      我也会使用JsonResponse objects:

      from django.http import JsonResponse
      
      def test(request): 
          output = request.is_ajax()
          return JsonResponse({'is_ajax': output})
      

      为了序列化dict以外的对象,您必须将safe参数设置为False:

      response = JsonResponse([1, 2, 3], safe=False)
      

      【讨论】:

      • 没用。 {"is_ajax": false} 是我得到的。
      • @KingDavid,如果你将这个:"X-Requested-With": "XMLHttpRequest" 添加到标题中?
      • 问题不在于获取 is_ajax 标志,请求似乎没有到达视图。即使请求类型是 POST,request.method 也会返回 GET。 request.body 中没有数据,request.POST.get('datatopass');不管使用什么方法。我使用 request.is_ajax() 只是为了确保我收到了请求,但我的问题是,我不认为我是。仍然无法使用您建议的附加标题。
      • @KingDavid,当您从浏览器控制台调用 AJAX 时会发生什么?
      • 我该怎么做?
      猜你喜欢
      • 2021-09-13
      • 1970-01-01
      • 2019-08-02
      • 1970-01-01
      • 2020-02-27
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多