Django: Как загрузить файл на клиенте после Ajax-запроса

У меня есть приложение django, в котором пользователи могут сохранять свои контакты. Я не строю поток для того, чтобы пользователи могли загружать свои контакты локально.

Для этого я создал CTA ("скачать"), при нажатии на который

  1. Gets the id of the contact selected
  2. Triggers an Ajax request to my views
  3. 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')
            }
          });
    })




Вернуться на верх