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を忘れて、フォームが無効な場合はエラーページを返しました