【问题标题】:Download static file displayed in the list Django下载 Django 列表中显示的静态文件
【发布时间】:2018-07-28 06:21:59
【问题描述】:

我正在尝试从我的 Django 应用程序的模板中下载静态文件。

def list(request):
    folder = '/home/galander/Desktop/Projekty/django-pdf-generator/django-pdf/generator/static/pdfs'

    file_list = os.listdir(folder)
    return render_to_response('list.html', {'file_list': file_list})


def download_file(request):
    pdf_folder = '/home/galander/Desktop/Projekty/django-pdf-generator/django-pdf/generator/static/pdfs'
    response = HttpResponse(pdf_folder, content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="nowy.pdf"'
    return response

list.html

{% for file in file_list %}
    <a href="/home/galander/Desktop/Projekty/django-pdf-generator/django-pdf/generator/static/pdfs/{{ file }}">{{ file }}</a>
{% endfor %}

目前我的当前输出相当明显 - Django 正在寻找匹配的 url 模式,但它失败了。我在 download_file(request): 中的 filename="nowy.odf" 是硬编码 atm 仅用于测试目的。

我正在考虑的2个解决方案:

1) 在 url.py 中为 url 模式创建适当的正则表达式,以满足重定向到我无法完成的 download_file 视图 2)我应该以某种方式更改我的静态/pdf文件夹的显示方法

更新

我之前添加了 STATIC_URL 和 STATIC_ROOT 作为也运行 collectstatic (我的应用程序正在生成 pdf 并将它们保存到静态文件夹中,这是这样做的必要条件)。我还添加了 URL 模式部分(使用 serve,而不是 static_view.serve,因为文档是这样说的)。

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "static")

if settings.DEBUG:
urlpatterns += [
    url(
        r'^media/(?P<path>.*)$', serve,  # NOQA
        {'document_root': settings.MEDIA_ROOT,
        'show_indexes': True}
    ),
] + staticfiles_urlpatterns()  # NOQA

我的项目如下所示:

不幸的是,我不了解静态前期的路径

    <a href="{% static 'django-pdf/generator/static/pdfs/nowy.pdf' %}">{{ file }}</a>

更准确地说,这里的静态是如何工作的以及这意味着什么。当前输出仅显示未找到该文件。应用程序在调试模式 atm 下不起作用。

【问题讨论】:

    标签: python django django-templates django-views


    【解决方案1】:

    你需要使用django的静态文件app。

    通常在您的settings.py 中,您会定义类似的静态路径;

    STATIC_ROOT = os.path.join(BASE_DIR, 'static-collection')
    STATIC_URL = '/static/' 
    

    然后您运行manage.py collectstatic,它将所有静态文件收集到您的STATIC_ROOT 目录中,您的项目从STATIC_URL 提供服务。

    在调试模式下,您可以将以下内容添加到您的urls.py

    urlpatterns = []
    
    # This is only needed when using runserver.
    if settings.DEBUG:
        urlpatterns += [
            url(
                r'^media/(?P<path>.*)$', static_views.serve,  # NOQA
                {'document_root': settings.MEDIA_ROOT,
                'show_indexes': True}
            ),
        ] + staticfiles_urlpatterns()  # NOQA
    

    所以,看看你发布的内容,你的项目可能是Projekty,而你的一个应用程序是django-pdf-generator。如果您的应用程序中有静态目录,django 将在collectstatic 期间将静态文件收集到您的STATIC_ROOT。所以也许有像Projekty/django-pdf-generator/static/django-pdf/generator/pdfs这样的路径

    基于此,您可能会在模板中这样做;

    <!DOCTYPE html>
    {% load static from staticfiles %}
    
    <html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1">
    
        <title>My website</title>
    
        <!-- ALL OF THE STYLES -->
        <link rel="stylesheet" href="{% static "css/style.css" %}">
    </head>
    
    <body>
    
        <p>Click <a href="{% static 'pdfs/nowy.pdf' %}">here</a> to download my PDF</p>
    
    
    </body>
    

    希望您可以在模板中看到路径如何与应用中的静态路径匹配?

    【讨论】:

    • 当我将我的 url 模式硬编码为 url(r'^home/galander/Desktop/Projekty/django-pdf-generator/django-pdf/generator/static/pdfs/nowy.pdf/', views.download_file, name='download_file') 时,它正在加载 download_view.view 并且工作正常,但显然它不应该被硬编码。似乎创建正则表达式以匹配文件路径的 url 模式在这里可以工作。但是,我缺乏如何使其动态化的想法
    • 好的,我认为 django 会抱怨您的静态根目录和静态 URL 是相同的。此外,{% static %} 只是 django 的静态应用程序的模板标签,用于在模板中包含静态文件。根据您的屏幕截图,您可以在模板中包含 PDF 文件,例如; {% static 'pdfs/nowy.pdf' %}。您说您正在生成 PDF。如果您正在创建内容,则不应将其存储在静态中。看看一些教程什么的; djangobook.com/generating-pdfs
    • 这仍然不起作用。我正在寻找合适的正则表达式来匹配我的要求。关于将文件保存在静态文件夹中 - 我需要避免将文件保存在数据库中。存储它们的唯一解决方案实际上是静态文件夹,但如果你这么说,我可能需要找到其他解决方案。无论如何谢谢:)
    • 你说得对,它应该在媒体文件中,而不是静态的-_-
    【解决方案2】:

    你可以使用简单的html标签来下载静态文件

    {% load static %} <!-- In top-->
    
    <a href="{% static "mysite/resume.docx" %}" alt="My image">Click Here</a>
    

    并将文件(例如 resume.docx)保存在 myapp/static/mysite

    【讨论】:

      猜你喜欢
      • 2021-05-30
      • 1970-01-01
      • 2013-09-14
      • 2020-01-04
      • 2018-12-24
      • 2021-06-02
      • 2021-11-03
      • 2021-11-16
      • 2019-04-13
      相关资源
      最近更新 更多