我正在使用 django 1.5 + Mezzanine + django-ajax-upload-widget。我有 django-ajax-upload-widget 的问题。
因此,当我尝试在表单中选择文件时,我遇到了上传错误。正如我所理解的(通过使用 js 调试器) - 问题是 jQuery 使用错误处理程序来处理成功的响应。
所以这里是处理ajax上传的视图:
@csrf_exempt
@require_POST
def upload(request):
form = UploadedFileForm(data=request.POST, files=request.FILES)
if form.is_valid():
uploaded_file = form.save()
data = {'path': uploaded_file.file.url,}
return HttpResponse(simplejson.dumps(data))
else:
return HttpResponseBadRequest(simplejson.dumps({'errors': form.errors}))
我还尝试了 python 调试器,所以文件上传导致运行这一行:
return HttpResponse(simplejson.dumps(data))
因此,这意味着文件上传成功(我还检查了目标文件夹 - 它包含此文件)。据我了解,使用HttpResponse
意味着请求状态为 200。因此,jQuery 运行error
处理程序而不是success
. 所以。这意味着当jQuery尝试处理数据时可能会出现问题,但这里是js代码:
$.ajax(this.$element.data('upload-url'), {
iframe: true,
files: this.$element,
processData: false,
type: 'POST',
dataType: 'json',
success: function(data) { self.uploadDone(data); },
error: function(data) { self.uploadFail(data); }
});
所以,processData: false
这里没有处理。
您如何看待 - 可能导致问题的原因是什么?以及如何解决?
添加:
我将错误处理程序更改为
AjaxUploadWidget.prototype.uploadFail = function(jqXHR, textStatus, errorThrown){
if(this.options.onError) {
this.options.onError.call(this);
} else {
console.log('Upload failed:');
console.log(jqXHR, textStatus, errorThrown);
}
};
所以,js控制台显示它是“parsererror”。
问题解决了
我尝试console.log(jqXHR.responseText);
在错误处理程序中查看以下内容:
if (window.top.ripple) { window.top.ripple("bootstrap").inject(window, document); }{"path": "/static/media/ajax_uploads/c351360b8aa7417b89f51cdd9e9057ae-Koala.jpg"}
但我必须看到这个:
{"path": "/static/media/ajax_uploads/c351360b8aa7417b89f51cdd9e9057ae-Koala.jpg"}
所以,我在 Chrome 中关闭了 Ripple 插件,一切正常 o_O :-)
但是很奇怪,有些插件会破坏前端js的工作。你对此有什么想法吗?