我试图在 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(
解决办法是将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