How to Render and Open PDF file in Django?
Interestingly to render PDF file in Django you don’t need to create HTML template.
In this tutorial, we are going to setting up the static PDF file and render and allow user to downlow PDF file.
There are two ways to access the static file in the Django Python script. One is using
static() method. Another is using
Here is the twist. You can not use the static file path you get from
static() method to open the file. If you use it, you will get an error saying…
FileNotFoundError Exception Value: [Errno 2] No such file or directory: '/static/sample.pdf'
So, use later one.
Here is the sample code to set a view (view.py) to render and open PDF file in Django.
from django.http import FileResponse import os def show_pdf(request): filepath = os.path.join('static', 'sample.pdf') return FileResponse(open(filepath, 'rb'), content_type='application/pdf')
Some of the points you should remember.
- Django view function returns the
FileResponse. You need to import it from
- Open file in the ‘rb’ mode using Python
- You have to provide the complete or relative path to your PDF file.
FileResponsecontent-type should be ‘application/pdf’.
- Make sure, you have a PDF file present in your project static directory.
It is not good practice to hardcode the file path. File path of the static files can vary while deploying production build.
If you are getting
FileNotFoundError, check this tutorial where I have described steps to debug this issue.
Note: If you have a download manager installed on your system, it will start downloading PDF file rather than showing it in the browser. If you want to prevent users from downloading or saving PDFs, this is not a recommended solution.
There are many use cases to open pdf file in Django. For example, if you are building an eCommerce website, with this technique you can allow users to download the invoices for purchased products and services. You can also allow users to download the specific documentation files.
There are different methods to open PDF file in Django based on the use case. Here we have discussed the simplest one. If you have any queries, let me know in the comment.