nesalexy
nesalexy

Reputation: 878

Create download link file in django

I created a file in project, generation pdf from html. For this i have this method:

 def generation_html_to_pdf(self):
        path_pdf = None
        with NamedTemporaryFile(delete=False, suffix=".pdf", dir='pdf_files') as tf:
             path_pdf = tf.name
             pdfkit.from_file('templates/first_page.html', tf.name)

        return path_pdf 

Then, in pdf_files folder i have the pdf file. I want to get a download link for this file:

my view

path_to_pdf = generation_html_to_pdf()
download_link = 'http://' + request.get_host() + path_to_pdf
json_inf_pdf = {'download_link':  download_link}
return JsonResponse(json_inf_pdf, status=200)

i have json like this:

{"download_link": "http://127.0.0.1:8000/home/alex/projects/test_project/pdf_files/tmpe0nqbn01.pdf"}"

when i click in this link i have error:

Page not found (404)

Upvotes: 2

Views: 3572

Answers (1)

Borut
Borut

Reputation: 3364

You need to create download view and url. Function like this to create link:

def download_link(request):
    ''' Create download link '''
    download_link = 'http://{}/{}'.format(request.get_host(), 'download/my_filename')
    json_inf_pdf = {'download_link':  download_link}
    return JsonResponse(json_inf_pdf, status=200)

and to download pdf:

def download_file(request, my_filename):
    ''' Download file '''
    # Open template
    from django.conf import settings
    template_url = os.path.join(settings.BASE_DIR, 'templates', 'first_page.html')
    template_open = open(template_url, 'r')
    # Read template
    from django import template
    t = template.Template(template_open.read())
    c = template.Context({})
    # Create pdf
    pdf = pdfkit.from_string(t.render(c))
    # Create and return response with created pdf
    response = HttpResponse(pdf)
    response['Content-Type'] = 'application/pdf'
    response['Content-disposition'] = 'attachment ; filename = {}'.format(my_filename)

    return response 

and url:

path('/download/<str:my_filename>', views.download_file, name="download_pdf')

I can't guarantee that this will work in your case without modification, since I can't tell which html-to-pdf library you're using and without seeing your other code. It's just a basic implementation idea.

Upvotes: 2

Related Questions