我是 Django 新手,我需要一些帮助。我想下载路径为
plik.localisation
的文件(它是从循环中获取的)。问题出在路径上。有人可以帮助我吗?我做错了什么?
我的观点.py是:
def download(request, path):
file_path = os.path.join(settings.MEDIA_ROOT, path)
if os.path.exists(file_path):
with open(file_path, 'rb') as fh:
response = HttpResponse(fh.read(), content_type="application/pdf")
response['Content-Disposition'] = 'inline; filename=' + os.path.basename(file_path)
return response
raise Http404
网址
path('download/<str:path>',views.download, serve, name="download"),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
HTML
<div class="com">
{{plik.localisation}} <a href="{% url 'download/path' %}" class="button">download</a>
</div>
我尝试更改该路径,但仍然存在问题。
您的
path()
中没有 name
和 'download/path'
urlpatterns
,因此当您单击该锚标记时,您将获得 404 HTTP 响应状态。
你想要的是:
<div class="com">
<a href="{% url 'download' plik.localisation %}" class="button">download</a>
</div>
旁白:
您想将文件显示为网页的一部分吗(考虑到您正在使用标题
Content-Disposition: inline
)?如果是这样,为什么要给锚标记添加 "download"
的文本?如果它是由客户端下载的,那么服务器代码应该是这样的:
#•••Rest of code•••
if os.path.exists(file_path):
return FileResponse(open(file_path, 'rb'), as_attachment=True, filename=os.path.basename(file_path)) #[1]
如果文件要作为网页的一部分显示,则锚标记的文本不应为
"download"
。这是误导。它可能应该是 "view"
、"open"
或同一消息的任何其他变体,因为它不会被下载。那么你的代码将是:
#•••Rest of code•••
if os.path.exists(file_path):
return FileResponse(open(file_path, 'rb'), filename=os.path.basename(file_path))[2]
[1] 当可以从
Content-Type
或 filename
的名称猜测时,会自动设置 open_file
标头,因此不需要 "application/pdf"
。
[2]
as_attachment
默认为 False
。 Content-Disposition: inline
现在将成为标题集。