seguente risposta di @ radtek sopra ho deciso di indagare un display vista della classe-based. Ho provato a utilizzare View
ma non aveva il metodo get_context_data()
.
Ho cercato here per qualche consiglio. Ho optato per BaseDetailView
poiché volevo visualizzare solo un oggetto.
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
Commento
1 Questa linea accessi un argomento di nome pk
approvata dal URL chiamando la vista.
2 Questa riga ottiene l'oggetto modello pdf effettivo.
3 Ho definito un metodo filename(self): return os.path.basename(self.file.name)
nel mio modello per aiutarmi a ottenere solo il nome file e l'estensione.
4 Questa riga ottiene il filepath completo.
Quindi utilizzare la risposta del file come spiegato nelle risposte precedenti. Ricorda inoltre di utilizzare rb
per leggere il file pdf
Non funziona per me fino a quando ho cambiato 'mimetype = 'application/pdf' a 'contenttype =' application/pdf'' –
content_type, anche pdf.closed non ha effetto lì – amchugh89
okay il ritorno prima di chiudere il file ??? Penso di no. – azuax