如何在Django中添加目录下载链接?

时间:2017-07-27 13:35:13

标签: python django django-templates django-views

我开发了一个数据科学网络应用程序,可生成各种统计分析相关图表。从Django应用程序执行的统计函数称为" ProtocolApp",其中我有一个目录为" Statistical_protocols"虽然" Stat_Learning" project是基目录。我的程序正在生成一些图像文件和.csv输出文件,其中包含项目的基本目录" Stat_Learning",同一目录,其中" manage.py"存在"。

在模板中,我提供了所有文件的链接:

模板:

{% extends 'protocol/base.html' %}

{% load static %}


{% block content %}

<style type="text/css">

    table {

     margin-bottom: 20px;

     border-collapse: collapse;
     border-spacing: 0;
     width: 30%;
     border: 1px solid #ddd;
     bgcolor: #00FF00;
}

th, td {
    border: none;
    text-align: left;
    padding: 8px;
}

tr:nth-child(even){background-color: #f2f2f2}

</style>



<div style="overflow-x:auto;">
  <table align="center">
    <tr>
      <th align="center">Result files</th>
    </tr>
    {% for a in names %}
    <tr>
     {% if a %}
      <td><a href="/virtual_env_dir/Base_rectory_of_the_project/{{a}}"> {{a}} </a> <br></td>
     {% endif %}
    </tr>
    {% endfor %}
  </table>
</div>


{% endblock %}

是否有方法通过此基本目录为所有文件提供可下载链接。

或者是否有任何方法可以添加另一个名为&#34; Downloads&#34;其他人然后媒体目录。因为我使用媒体目录上传协议的输入文件。

感谢

2 个答案:

答案 0 :(得分:1)

试试这个:

创建一个这样的视图:

def send_file(request):
    import os, tempfile, zipfile, mimetypes
    from django.core.servers.basehttp import FileWrapper
    from django.conf import settings
    filename     = settings.BASE_DIR + <file_name>
    download_name ="example.csv"
    wrapper      = FileWrapper(open(filename))
    content_type = mimetypes.guess_type(filename)[0]
    response     = HttpResponse(wrapper,content_type=content_type)
    response['Content-Length']      = os.path.getsize(filename)    
    response['Content-Disposition'] = "attachment; filename=%s"%download_name
    return response

为此创建一个url,让anchor标记指向该url。请务必将download属性添加到您的锚标记

答案 1 :(得分:0)

我不确定这完全回答了你的问题,但我工作的公司运行Django网站(1.10.5),我们倾向于使用django管理面板将文件上传到媒体目录。管理面板还提供了一个页面编辑器,您可以在其中设置页面的URL,然后放入指向媒体文件的链接。 Django定义了一个允许您通过任何根URL访问媒体库的设置:

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
MEDIA_URL = "/media/"

但是如果您定义的进程生成随机命名的文件,您可以定义一个URL来指向某个视图的标准方法。视图的伪代码可能如下所示:

def protocolView(request):
   someListOfDirs = ...
   context = { names: [] }
   for directory in someListOfDirs:
        for root, dirs, files in os.walk(directory):
            for file in files:
                if file is a generated file:
                     context["names"].append(file)
    render(request, "template.html", context)