Django: Как загрузить файл на клиенте после Ajax-запроса
У меня есть приложение django, в котором пользователи могут сохранять свои контакты. Я не строю поток для того, чтобы пользователи могли загружать свои контакты локально.
Для этого я создал CTA ("скачать"), при нажатии на который
- Gets the id of the contact selected
- Triggers an Ajax request to my views
- In the view I get the contact id, retrieve the data from my DB and create a VCF card out of it. (A contact card - basically a text file)
Сейчас я хотел бы, чтобы такой файл загружался на машину клиента, но не знаю, как это сделать.
Мне удалось сделать это, если я перенаправляю на новый url, где представление делает то же самое, что и мое представление ниже, я хочу позволить пользователям скачать файл без перенаправления на новую страницу. Кроме того, я пытаюсь избежать хранения идентификаторов контактов в URL.
Поэтому я пытаюсь использовать ajax, но думаю, что это создает проблемы, потому что Ajax-запрос ожидает JsonReponse от представления.
Я пробовал и GET, и POST, но ничего не получается.
В настоящее время я придерживаюсь следующего мнения:
def get(self, request, *args, **kwargs):
#Get the ids
ids = request.GET.getlist('contact_ids[]')
# Get contqacts associated with ids
contacts = Contact.objects.filter(id__in=ids)
# Transform contacts into long text
text = Vcard().GroupVcards(contacts)
#Create file on the fly and attach it to the response (is this correct actually?)
response = HttpResponse(content_type='text/plain')
response['Content-Disposition'] = 'attachment;filename=ven.vcf'
response.writelines(text)
#return
return response
Это Jquery, запускающий ajax
$('.Vcard').on('click', function(e) {
let id = $(this).data('contact_id')
$.ajax({
type: "GET",
url: Urls['action:DownloadContact'](),
data: {
csrfmiddlewaretoken: csrftoken,
'contact_ids': [id],
},
error: function(response){
console.log(response)
console.log('error')
},
success: function(response) {
console.log(response)
console.log('success')
}
});
})