Django не возвращает ajax ответ с dataType: "JSON" - PullRequest
0 голосов
/ 13 марта 2020

Я хочу отправить json на сервер и получить CSV.

У меня есть Ajax вот так

var data = {"data":1}
$.ajax({
        type: "POST",
        url: "api/export_csv",
        data:JSON.stringify(data), 
  //    dataType: "JSON",   // if I comment out here it works.
        success: function(response) {
            console.log("success");
            DownloadCsv(response);
        }
});

//parse response to CSV
const DownloadCsv = (function() {
  const a = document.createElement("a");
  document.body.appendChild(a);
  a.style = "display: none";
  return function(data, fileName) {
    const blob = new Blob([data], {type: "octet/stream"}),
      url = window.URL.createObjectURL(blob);
    a.href = url;
    a.download = fileName;
    a.click();
    window.URL.revokeObjectURL(url);
  };
}());

Затем в django view.py

@api_view(['POST', 'GET'])
def export_csv_view(request):
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename=somefilename.csv'
    writer = csv.writer(response)
    writer.writerow(['First row', 'A', 'B', 'C', '"Testing"', "Here's a quote"])
return response

Очень странно. Если я закомментирую dataType: "JSON", он будет работать, но если я добавлю эту строку, он не будет работать без ошибок (javascript консоль).


Проблема решена. Я использую contentType вместо datatype.

contentType: 'application/JSON', 
//dataType: "JSON", 

Я неправильно их понял.

contentType для отправки. dataType для получения

Ответы [ 2 ]

0 голосов
/ 13 марта 2020

Проблема решена. Я использую contentType вместо datatype.

contentType: 'application/JSON', 
//dataType: "JSON", 
I misunderstood these.

contentType для отправки. dataType предназначен для приема

Однако я обнаружил, что если я использую только dataType: "JSON", django ожидаю, что отправляющая и получающая данные оба JSON.

Так что это сбивает с толку.

0 голосов
/ 13 марта 2020

Попробуйте изменить строку:

response = HttpResponse(content_type='text/csv')

на

response = HttpResponse(content_type='application/json')

, как правильно указала evolutionxbox.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...