简体   繁体   English

如何在模板中请求 GET 参数以获取文件列表?(Django Zip 文件下载问题)

[英]How to request GET parameters in templates for a list of files?(Django Zip File Download Issue)

I want to download all the single or multiple files created by the function by zipping them.我想通过压缩下载 function 创建的所有单个或多个文件。

The problem is with templates.问题出在模板上。 Please suggest properly to pass the GET parameters for a list of files I got an error:请正确建议为我收到错误的文件列表传递 GET 参数:

FileNotFoundError at /test/
[Errno 2] No such file or directory: '['

This is the error for improperly placing the query string that is referring to the list of files.这是错误放置引用文件列表的查询字符串的错误。

My views are as follows:我的看法如下:

def submit(request):
    def file_conversion(input_file,output_file_pattern,chunk_size):
            output_filenames = []
            with open(input_file,"r+") as fin:
    # ignore headers of input files
                for i in range(1):
                    fin.__next__()
            
                reader = csv.reader(fin, delimiter=',')
                
                
                for i, chunk in enumerate(chunked(reader, chunk_size)):
                    output_filename = output_file_pattern.format(i)
                    with open(output_filename, 'w', newline='') as fout:
                        output_filenames.append(output_filename)
                        writer = csv.writer(fout, reader, delimiter='^')
                        writer.writerow(fed_headers)
                        writer.writerows(chunk)
                            # print("Successfully converted into", output_file)
                return output_filenames

    paths = file_conversion(input_file,output_file+'{01}.csv',10000)
    # paths return a list of filenames that are created like output_file1.csv,output_file2.csv can be of any limit
    # when i tried paths[0], it returns output_file1.csv
    context = {'paths' :paths}

def test_download(request):
    paths = request.GET.get('paths')
    context ={'paths': paths}
    response = HttpResponse(content_type='application/zip')
    zip_file = zipfile.ZipFile(response, 'w')
    for filename in paths:
        zip_file.write(filename)
    zip_file.close()
    response['Content-Disposition'] = 'attachment; filename='+'converted files'
    return response

templates模板

<p> 
<a href ="{% url 'test_download' %}?paths={{ paths|urlencode }} " download>Converted Files</a> </p>
<br>

Help me to find the issue here.帮我在这里找到问题。

Issue:问题: 在此处输入图像描述

the?path is looking for file but it has found the list. the?path 正在寻找文件,但它找到了列表。

Then I tried:然后我尝试了:

def test_download(request):
    paths = request.GET.getlist('paths')
    context ={'paths': paths}
    response = HttpResponse(content_type='application/zip')
    zip_file = zipfile.ZipFile(response, 'w')
    for filename in paths:
         zip_file.write(filename)
    zip_file.close()
    response['Content-Disposition'] = 'attachment; filename='+'converted files'
    return response

templates:模板:

<p> <a href ="{% url 'test_download' %}?paths=path1 " download>Converted Files</a> </p>
<br>

It looks for the file as它查找文件为

FileNotFoundError at /test/
[Errno 2] No such file or directory: '/home/rikesh/Projects/FedMall/main/temp/47QSHA19D003A_UPDATE_20210113_{:01}.csv'

在此处输入图像描述

在此处输入图像描述

the file path should be:文件路径应该是:

/home/rikesh/Projects/FedMall/main/temp/47QSHA19D003A_UPDATE_20210113_0.csv

request.GET.get('paths') returns a string representation of your list of paths, not a list object. request.GET.get('paths')返回路径列表的字符串表示形式,而不是列表 object。 The returned value would be like this "['/path/file1', 'path/file2']" .返回的值将是这样"['/path/file1', 'path/file2']" When you iterate through paths, it actually iterates through each char in your string.当您遍历路径时,它实际上会遍历字符串中的每个字符。 That is why it first tries to find a directory with the name [ .这就是为什么它首先尝试查找名称为[的目录。

To pass a list of file paths to a GET request, you would need to change your url to this要将文件路径列表传递给GET请求,您需要将 url 更改为此

<your_url>?paths=path1&paths=path2&paths=path3...

In your Python code, get the file paths with this在您的 Python 代码中,使用此获取文件路径

request.GET.getlist('paths')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM