siguiente respuesta de @ radtek anterior decidí investigar una pantalla de lectura clasista. Traté de usar View
pero no tenía el método get_context_data()
.
Miré here para obtener orientación. Me conformé con BaseDetailView
ya que quería mostrar solo un objeto.
from django.http import FileResponse
from django.shortcuts import get_object_or_404
from django.views.generic.detail import BaseDetailView
class DisplayPdfView(BaseDetailView):
def get(self, request, *args, **kwargs):
objkey = self.kwargs.get('pk', None) #1
pdf = get_object_or_404(Pdf, pk=objkey) #2
fname = pdf.filename() #3
path = os.path.join(settings.MEDIA_ROOT, 'docs\\' + fname)#4
response = FileResponse(open(path, 'rb'), content_type="application/pdf")
response["Content-Disposition"] = "filename={}".format(fname)
return response
Comentario
1 Esta línea tiene acceso a un argumento con nombre pk
aprobada por la URL llamando a la vista.
2 Esta línea obtiene el objeto del modelo pdf real.
3 Definí un método filename(self): return os.path.basename(self.file.name)
en mi modelo para ayudarme a obtener solo el nombre de archivo más la extensión.
4 Esta línea obtiene la ruta de archivo completa.
A continuación, utilice la respuesta del archivo como se explica en las respuestas anteriores. También recuerde usar rb
para leer el archivo pdf
No funciona para mí hasta que me he cambiado 'MIME = 'application/pdf' to 'contenttype =' application/pdf'' –
content_type, también pdf.closed no tiene ningún efecto allí – amchugh89
¿está bien la devolución antes de cerrar el archivo? Yo creo que no. – azuax