按照上面@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) #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
评论
pk
1 此行访问由调用视图的 url 传递的命名参数。
2 此行获取实际的 pdf 模型对象。
3 我filename(self): return os.path.basename(self.file.name)
在模型中定义了一个方法来帮助我只获取文件名和扩展名。
4 此行获取完整的文件路径。
然后按照上述答案中的说明使用文件响应。还记得使用rb
阅读pdf文件