Sau câu trả lời @ radtek của trên, chúng tôi quyết định nghiên cứu một màn hình xem dựa trên lớp. Tôi đã cố gắng sử dụng View
nhưng không có phương thức get_context_data()
.
Tôi đã xem here để được hướng dẫn. Tôi đã giải quyết cho BaseDetailView
vì tôi muốn hiển thị chỉ một đối tượng.
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
Commentary
1 dòng này truy cập một tên lập luận pk
thông qua url gọi xem.
2 Dòng này nhận đối tượng mô hình pdf thực tế.
3 Tôi đã xác định phương thức filename(self): return os.path.basename(self.file.name)
trong mô hình của mình để giúp tôi chỉ lấy tên tệp và phần mở rộng.
4 Dòng này nhận được tệp hoàn chỉnh.
Sau đó, sử dụng phản hồi tệp như được giải thích trong các câu trả lời ở trên. Ngoài ra, hãy nhớ sử dụng rb
để đọc tệp pdf
Nó không làm việc cho tôi cho đến khi tôi đã thay đổi 'Mimetype = 'application/pdf' thành 'contenttype =' application/pdf'' –
content_type, cũng pdf.closed không có hiệu lực ở đó – amchugh89
là nó ok sự trở lại trước khi đóng tập tin? Tôi nghĩ là không. – azuax