繁体   English   中英

Django 查看未收到 ajax 请求

[英]Django view not getting ajax request

我的模板中有一个脚本试图在 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>

网址.py

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

视图.py

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

Django 3.1 is_ajax()方法已弃用。 参见杂项 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 对象

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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM