następującą odpowiedź @ radtek za wyżej postanowiłem zbadać widok wyświetlacza klasy oparte. Próbowałem użyć View
, ale nie miałem metody get_context_data()
.
Dla niektórych wskazówek wyglądałem na here. Zdecydowałem się na BaseDetailView
, ponieważ chciałem wyświetlić tylko jeden obiekt.
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
Komentarz
1 Ta linia dostęp nazwanego argumentu pk
przekazywana przez URL wywołującego widoku.
2 Ta linia pobiera rzeczywisty obiekt modelu pdf.
3 W moim modelu zdefiniowałem metodę filename(self): return os.path.basename(self.file.name)
, która pomoże mi uzyskać samą nazwę pliku i rozszerzenie.
4 Ta linia otrzymuje pełną ścieżkę do pliku.
Następnie użyj odpowiedzi na plik, jak wyjaśniono w powyższych odpowiedziach. Pamiętaj też, aby użyć pliku rb
, aby przeczytać plik PDF:
To nie działa na mnie, dopóki nie zmieniłem 'mimetype = "application/pdf" to "contenttype =" application/pdf'' –
content_type, również pdf.closed nie ma tam żadnego efektu – amchugh89
czy to jest w porządku, zanim zamkniesz plik ??? Myślę, że nie. – azuax