在查看了@radtek上面的答案后,我决定研究基于类的视图显示。我尝试使用View
,但它没有get_context_data()
方法。
我在这里寻找一些指导。我选择了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)
pdf = get_object_or_404(Pdf, pk=objkey)
fname = pdf.filename()
path = os.path.join(settings.MEDIA_ROOT, 'docs\\' + fname)
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文件。
mimetype='application/pdf'
改为contenttype='application/pdf'
,它才对我起作用。 - Andriy Ivaneyko__exit__
调用吗? - TankorSmashrb
而不是r
,因为PDF文件不是文本文件。 - Flimm