Django:单击按钮时如何将所有文件下载为zip?

Posted

技术标签:

【中文标题】Django:单击按钮时如何将所有文件下载为zip?【英文标题】:Django: How to download all files as zip when button is clicked? 【发布时间】:2019-11-26 09:01:58 【问题描述】:

我已经看到很多关于如何在 Django 中提供 zip 文件以供下载的答案,但没有人明确告诉如何在客户端调用它。也许答案太明显了,但我真的不明白。

我有一个数据表,并且在每一行中都包含了一个下载按钮。当用户单击它时,所有关联的文件都将以 zip 格式下载。这是我的代码:

在我的views.py

def download_zipfile(self, request):
  filelist = [MyModel.path_to_file1, MyModel.path_to_file2, MyModel.path_to_file3]
  byte_data = BytesIO()
  zip_name = "%s.zip" % MyModel.id_no
  zip_file = zipfile.ZipFile(byte_data, 'w')

  for file in filelist:
    filename = os.path.basename(os.path.normpath(file))
    zip_file.write(file, filename)
  zip_file.close()

  response = HttpResponse(byte_data.getvalue(), content_type='application/zip')
  response['Content-Disposition'] = 'attachment; filename=%s' %zip_name

  zip_file.printdir()

  return response

在我的urls.py 我有:

urlpatterns = [
  path('download/<int:pk>', download_zipfile, name='download_zipfile'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

在我的 html 模板中,我有:

<tr id="datarows">
  <td> mymodel.data1 </td>
  <td> mymodel.data2 </td>
  <td> mymodel.data3 </td>
  <td>
    <a href="% url 'download_zipfile' mymodel.pk %" target="_blank">
      <i class="fas fa-download"></i>
    </a>
  </td>
</tr>

我不断收到此错误:

django.urls.exceptions.NoReverseMatch: Reverse for 'download_zipfile' with arguments '('',)' not found. 1 pattern(s) tried: ['download/(?P<pk>[0-9]+)$']

如果有人能提供帮助,我将不胜感激。提前致谢!

编辑 这是呈现我的 HTML 模板的视图:

class MyModelListView(LoginRequiredMixin, ListView):
  model = MyModel
  template_name = 'mymodel_list.html'
  context_object_name = 'mymodels'
  login_url = 'login'

【问题讨论】:

添加呈现您提供的 HTML 的视图代码 你是不是在你的url中缺少尾随/ 嗨@NalinDobhal。抱歉,您是指我的 ListView 吗? @PedramParsian 我添加了它,还尝试省略了&lt;int:pk&gt;,但它仍然没有用。 @Semb 是的,如果查看该 HTML 页面。 【参考方案1】:

解码那个错误!

Reverse for 'download_zipfile' with arguments '('',)' not found. 

它试图用一个位置参数,一个空字符串来反转'download_zipfile'。 (参数报告为一个元组,'('',)' 是一个包含空字符串的单元组)

href="% url 'download_zipfile' mymodel.pk %"

mymodel.pk 产生一个空字符串。我猜mymodel 没有传递给模板进行渲染,或者它不是保存的对象,因此它的pkNone。无论如何,一个空字符串不是整数所要求的

path('download/<int:pk>', download_zipfile, name='download_zipfile'),

【讨论】:

我明白了!而不是download_zipfile(self, request),我将其更改为download_zipfile(request, pk),它现在可以工作了。谢谢!

以上是关于Django:单击按钮时如何将所有文件下载为zip?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Jquery 更改按钮单击时的 django 外键对象文本选择字段?

大家好,当我单击标题按钮时,我为每个标题获得了相同的博客

如何将python文件与html文件链接

在 django 模板中单击按钮后如何填充表格?

如何在android中压缩和解压缩png图像

Django admin:如何在单击自定义按钮时调用操作?