如何在模板中请求文件列表的GET参数?(Django Zip File Download Issue) [英] How to request GET parameters in templates for a list of files?(Django Zip File Download Issue)

查看:50
本文介绍了如何在模板中请求文件列表的GET参数?(Django Zip File Download Issue)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想通过压缩方式下载该功能创建的所有单个或多个文件.

I want to download all the single or multiple files created by the function by zipping them.

问题出在模板上.请正确建议为文件列表传递GET参数我遇到了错误:

The problem is with templates. Please suggest properly to pass the GET parameters for a list of files I got an error :

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.

我的看法如下:

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

模板

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

帮我在这里找到问题.

问题:

?path正在寻找文件,但找到了列表.

the ?path is looking for file but it has found the list.

然后我尝试:

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

模板:

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

它将文件查找为

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

文件路径应为:

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

推荐答案

request.GET.get('paths')返回路径列表的字符串表示形式,而不是列表对象.返回的值将类似于此" [['/path/file1','path/file2']" .当您遍历路径时,它实际上遍历了字符串中的每个字符.这就是为什么它首先尝试查找名称为 [.

request.GET.get('paths') returns a string representation of your list of paths, not a list object. The returned value would be like this "['/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 [.

要将文件路径列表传递给 GET 请求,您需要将网址更改为此

To pass a list of file paths to a GET request, you would need to change your url to this

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

在您的Python代码中,以此获取文件路径

In your Python code, get the file paths with this

request.GET.getlist('paths')

这篇关于如何在模板中请求文件列表的GET参数?(Django Zip File Download Issue)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆