I\'ve been trying to upload a simple text file for hours now but I still can\'t seem to get it working.
I keep getting invalid forms saying I\'m missing the \"file_s
Here's how we can send json data in addition to files using Ajax to Django.
Example:
JS using form-data
var formData = new FormData();
formData.append('file1', myFile);
const data_ = JSON.stringify(data)
formData.append('data', data_);
doPost(url, formData)
.then(result => {
})
Django using request.FILES & request.POST
data = json.loads(request.POST.get('data'))
files = request.FILES
attached_file1 = files.get('file1', None)
attr1 = data.get('attr1', None)
Here is what I changed to get it working.
I used FormData to package up data from form
Notice the parameters of the form in the Django view. I was not specifying "files" before and that's what caused the " file field required" error.
Javascript:
function upload(event) {
event.preventDefault();
var data = new FormData($('form').get(0));
$.ajax({
url: $(this).attr('action'),
type: $(this).attr('method'),
data: data,
cache: false,
processData: false,
contentType: false,
success: function(data) {
alert('success');
}
});
return false;
}
$(function() {
$('form').submit(upload);
});
Django View:
def upload_view(request):
if request.method == 'POST':
form = FileUploadForm(data=request.POST, files=request.FILES)
if form.is_valid():
print 'valid form'
else:
print 'invalid form'
print form.errors
return HttpResponseRedirect('/ingest/')
You can't use jQuery to upload files asynchronously. You options are:
1.Submit the form "the usual way". This, of course, will refresh the page.
2.Use XHR: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest but beware that it's not supported on IE 8/9 . On those browsers you would need to fall back to an iframe and a form that posts to it, to mimic an asynchronous upload.
3.Use https://github.com/blueimp/jQuery-File-Upload It does what I described in 2. but spares you all the configuring.