Django应用程序,如何下载与项目相关的所有文件?

问题描述 投票:0回答:1

我试图在 view.py 文件中创建一个定义来下载与项目关联的所有文件。这次我使用 python ZipFile 包来压缩所有文件,但我在找到正确的代码时遇到了很多麻烦

我的模特

class File(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    project_slug = AutoSlugField(populate_from='project', always_update=True)
    pub_date = models.DateTimeField(auto_now_add=True)

    def directory_path(instance, filename):
        return 'files_project/project_{0}/{1}'.format(instance.project_slug, filename)

    upload = models.FileField(upload_to=directory_path)

我的看法

def DownloadAllFilebyProject(request, id):
    project = Project.objects.get(id=id)
    files = project.file_set.all()
    zf = zipfile.ZipFile(os.path.join(settings.MEDIA_ROOT, 'files_project/project_{0}/'.format(project.slug), 'allfile.zip'), 'w')
    for file in files:
        zf.writestr(os.path.join(settings.MEDIA_ROOT, 'files_project/project_{0}/'.format(project.slug)), file)
    zf.close()

    return HttpResponse(print(zf))

我的模板

<a href="{% url 'apppro:DownloadAllFilebyProject' project.id  %}" class="btn btn-warning float-right" method="get"> descargar todos los archivos</a>

错误

TypeError at /downloadallzipfiles/13
object of type 'File' has no len(
django view django-templates model python-zipfile
1个回答
0
投票

解决办法是将zip包从zipfile改为shutil

def DownloadAllFilebyProject(request, id):
    project = Project.objects.get(id=id)
    zip_filename = os.path.join(settings.MEDIA_ROOT, 'files_project/project_{0}/'.format(project.slug), 'allfile_{0}.zip'.format(project.slug))
    dir_name = os.path.join(settings.MEDIA_ROOT, 'files_project/project_{0}/'.format(project.slug))
    if os.path.exists(zip_filename):
        os.remove(zip_filename)
    zip = shutil.make_archive(zip_filename, 'zip', dir_name)

    if os.path.exists(zip):
        with open(zip, 'rb') as fh:
            response = HttpResponse(fh.read(), content_type="application/vnd.ms-excel")
            response['Content-Disposition'] = 'inline; filename=' + os.path.basename(zip)
            return response
    raise Http404
© www.soinside.com 2019 - 2024. All rights reserved.