我希望 Django 创建的表单是 jQuery/Ajax 提交的;如果成功,我希望下载一个文件,如果表单无效,我希望返回我的 Django 表单。
我试图像这样“劫持” Django 表单以将其变成 jQuery/Ajax 的东西:(javascript 代码)
form.submit(function(e) {
e.preventDefault();
$.ajax({
data: form.serialize(), // form data
type: form.attr('method'),
url: form.attr('action'),
success: function(data, textStatus, jqXHR) {
var ctype = jqXHR.getResponseHeader('Content-Type');
if (ctype == 'text/html') {
$('#div_where_my_form_is').html(data);
}
else if (ctype == 'text/csv') {
// ???? my problem is here
}
}
});
});
我的 Django 视图代码是这样的:
# (if the form is invalid I return it (simple template containing only the form))
# if valid:
response = HttpResponse(mimetype='text/csv')
response['Content-Disposition'] = 'attachment; filename=filename.csv'
writer = csv.writer(response, delimiter=';')
writer.writerow(['...stuff written here...'])
return response
所以我的文件是动态创建的 CSV,这可能是需要注意的重要事项。
看看我如何在我的 jQuery 代码中使用 jqXHR 对象来检查返回的内容类型(欢迎任何更好的做法)。我的问题是,在成功的情况下,我无法让 jQuery 理解这是一个正在返回的文件,应该下载它。那可能吗?jQuery 只是将数据视为文本。
可能的解决方法:
- 进行第一次 ajax 调用以检查表单,如果可以,则进行“正常”(非 ajax)调用以下载文件
- 忘记ajax,如果表单无效,返回错误页面