继@ radtek的回答上面我决定调查基于类的视图显示。我试图使用View
,但它没有get_context_data()
方法。
我看了here的一些指导。我解决了BaseDetailView
,因为我只想显示一个对象。
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
评论
1此行访问由URL调用视图通过命名参数pk
。
2此行获取实际的pdf模型对象。
3我在我的模型中定义了一个方法filename(self): return os.path.basename(self.file.name)
,以帮助我获得文件名和扩展名。
4这一行获取完整的文件路径。
然后使用上面答案中所述的文件响应。还记得用rb
来阅读pdf文件
,直到我改变了'它不为我工作的MIME类型=的
login_required
要求'application/pdf' to'contenttype ='application/pdf'' – 2015-12-10 23:26:13content_type,也pdf.closed在那里没有效果 – amchugh89 2016-02-22 13:47:28
可以在关闭文件之前返回吗?我想不是。 – azuax 2016-04-19 20:03:14