【问题标题】:enabling a django download button for pdf download为 pdf 下载启用 django 下载按钮
【发布时间】:2020-10-10 06:41:06
【问题描述】:

我正在尝试设置一个 django 按钮,以便我可以下载文件。我尝试按照教程进行操作,但我认为我遗漏了一些东西。下面的urls.py 代码是我在项目的应用程序部分生成的urls.py 文件。我不确定这是否是正确的使用方法。 下面的代码不起作用,本地主机不加载页面。但是,当我在我的urls.py 中注释掉url('download_my_pdf', download_pdf), 时,网站会加载,因为我们没有该链接返回视图中的代码。

索引.HTML:

<input type="button" value="Download" onclick="window.open('download_my_pdf')">

VIEWS.PY:

from django.shortcuts import render
from django.http import HttpResponse
from wsgiref.util import FileWrapper

def index(request):
return render(request, "index.html", {})

def home(request):
return render(request, "home.html", {})

def download_pdf(request):
filename = 'faults.pdf'
content = FileWrapper(filename)
response = HttpResponse(content, content_type='application/pdf')
response['Content-Length'] = os.path.getsize(filename)
response['Content-Disposition'] = 'attachment; filename=%s' % 'faults.pdf'
return response

URLS.PY

from django.urls import url
from django.urls import path

from . import views

urlpatterns = [
 path('', views.index, name="index"),
 path('home', views.home, name="home"),
 url('download_my_pdf', download_pdf),
]

【问题讨论】:

  • 更新url('download_my_pdf', download_pdf), ______________ 到 _____________ path('download_my_pdf', views.download_pdf),
  • 当网站加载很好时,但是当我现在单击下载按钮时,它会抛出“str”对象没有属性“读取”错误。所以实际上没有下载文件。它在我的views.py中点亮第16行: response = HttpResponse(content, content_type='application/pdf')

标签: python html django django-views


【解决方案1】:

views.py

from django.http import HttpResponse, Http404

def open_file(request, *args, **kwargs):
    path = str(kwargs['p'])

    file_path = 'your path'
    if os.path.exists(file_path):
        with open(file_path, 'rb') as fh:
            response = HttpResponse(fh.read(), content_type="application/vnd.ms-excel")
            response['Content-Disposition'] = 'inline; filename=' + os.path.basename(file_path)
            return response
    raise Http404

模板/模板.html

                            &lt;a class="button" href="{% url 'open-file' path %}"&gt;Download&lt;/a&gt;

urls.py

path('open/<str:path>/', views.open_file, name='open-file'),

【讨论】:

  • 欢迎来到 Stack Overflow!请尽量使您的答案清晰完整。除了添加代码之外,尝试添加一些解释。
【解决方案2】:

对于您的代码,请尝试在您的 urls 文件中使用“views.download_pdf”,您正在使用它而不导入它

【讨论】:

  • 当网站加载很好时,但是当我现在单击下载按钮时,它会抛出 'str' object has no attribute 'read' 错误。所以实际上没有下载文件。在我的views.py中,它喜光第16行:response = HttpResponse(content, content_type='application/pdf')
【解决方案3】:

正如其他人已经建议的那样,您的 urls.py 有一个错误。您缺少 views.download_pdf 部分。我还建议命名它,以便将来可以将其用于可能的反向功能。此外,为了一致性和简单性,最好坚持使用路径功能。 URL 函数是允许正则表达式功能的 re_path 函数的别名,但这不是您的问题所必需的。

Django url reference

from django.urls import url
from django.urls import path

from . import views

urlpatterns = [
 path('', views.index, name="index"),
 path('home', views.home, name="home"),
 path('download_my_pdf', views.download_pdf, name="download_pdf"),
]

使用 URL 路由设置,可以创建一个下载按钮。我更喜欢下面的按钮。它看起来像一个按钮,因为它包含引导类,但在它下面是一个指向您的 download_pdf 视图的简单链接。

<a class="btn btn-primary" href="{% url 'download_pdf' %}" role="button">Download pdf</a>

按下按钮链接后,您将被重定向到您的 download_pdf 视图。这应该会激活下载。我没有测试您的视图代码。如果它仍然不起作用,请告诉我。可能还有另一个选项涉及PdfFileReaderExample

也许可以使用 PdfFileReader 读取您的文件,然后在您的 download_pdf 视图中返回它。祝你好运!

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 2016-07-02
    • 1970-01-01
    • 2021-10-11
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    相关资源
    最近更新 更多