我正在使用django服务器端表单来保存数据库中的详细信息。
Object
我正在使用ajax发布请求。
<form id="form_save_file" enctype="multipart/form-data">
{% csrf_token %}
<label class="control-label col-md-4">File:</label>
<div class="col-md-8">
{{form.fa_file}}
</div>
<label class="control-label col-md-4">Name:</label>
<div class="col-md-8">
{{form.name}}
</div>
</form>
我在settings.py中包含了中间件类
$("#form_save_file").submit(function(e) {
$.ajax({
type: "POST",
url: '/url/',
data: $("#form_save_file").serialize(),
contentType: false,
processData: false,
success: function(data){}
});
当我在ajax请求中删除MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'request.middleware.RequestMiddleware'
)
和contentType
时,processData
在views.py中为空,其他工作正常。
答案 0 :(得分:2)
false的contentType选项用于多部分/表单数据表单 传递文件。
当将contentType选项设置为false时,它会强制jQuery 添加Content-Type标头,否则,边界字符串将是 失踪了。此外,通过多部分/表单提交文件时 必须将processData标志设置为false,否则,jQuery会 尝试将FormData转换为字符串,这将失败。
尝试解决问题:
您正在使用jQuery的.serialize()方法创建文本字符串 标准的URL编码表示法。
使用“contentType:false”时,您需要传递未编码的数据。
尝试使用“new FormData”而不是.serialize():
来源:https://stackoverflow.com/a/20863123/3345051
修订代码:
$("#form_save_file").submit(function(e) {
e.preventDefault();
var $this = $(this);
var postURL = '/url/';
var formData = new FormData(this);
$.ajax({
type: "POST",
url: postURL,
data: formData,
mimeType: "multipart/form-data",
contentType: false,
cache: false,
processData: false
})
.done(function(response) {
// Do something if POST is successful
})
.fail(function() {
// Do something if POST is unsuccessful
})
})
答案 1 :(得分:0)
使用@csrf_exempt
装饰器禁用特定视图上的csrf并使用随机数/字符串构建自定义安全性