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



我已经看到了很多关于如何在 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'

解码该错误!

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'),

相关内容

  • 没有找到相关文章

最新更新