Django 1.10
在文档中我们可以阅读:
虽然上面的方法可以用于AJAX POST请求,但它有一些 不便之处:您必须记住在POST中传递CSRF令牌 每个POST请求的数据。
https://docs.djangoproject.com/es/1.10/ref/csrf/#ajax
上面提到的“上述方法”是关于向表单添加{%csrf_token%}。
在文档中说,更方便的可能是:
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
好吧,我无法发现{%csrf_token%}可能不方便。
我试过了:
<form action="" method="post">{% csrf_token %}
function post_create(){
$.ajax({
method: "POST",
url: '{{ object.get_frame_date_create_url }}',
data: $("#object_form").serialize(),
success: add_post_data,
error: fail,
});
}
似乎有效。 $(“#object_form”)。serialize()的结果如下所示:
"csrfmiddlewaretoken=NFgXO1gsHJbi0N1IUb5ZPQ2rno2RGBrRR8kxboewWDC63sm2hxlvXtUtyviCSoZ1&date=2015-01-01&precision=F&frame=1"
我在这里必须记住什么?我怎么能忘记传递csrfmiddlewaretoken?它只是形式的一个普通领域。隐藏在用户之外,但不是来自程序员。
是否有必要手动触摸表单中的每个字段并单独发送。我无法想象。
您的评论将受到高度赞赏:我是否理解正确$(“#object_form”)。serialize()没问题?在这种情况下,使用ajaxSetup是更具修道院的吗?
答案 0 :(得分:0)
您绝对没有理由需要HTML表单来发送POST请求。例如,此页面上的upvote / downvote按钮和收藏夹按钮都是简单的按钮,可以在不触及HTML表单的情况下发送AJAX POST请求。
异步提交表单只是AJAX的众多用例之一。如果这是您使用AJAX的唯一方法,那么来自文档的代码可能不会给您带来太大的好处。但是,如果您将其用于许多其他用例中,它将更加方便。