在Django模板中列出目录文件内容

7 投票
1 回答
15521 浏览
提问于 2025-04-16 11:04

我正在学习Python和Django。(感谢所有在这里贡献的人——这真是个宝贵的资源!)

我遇到的一个看似简单的问题是,如何将一组静态文件(比如我服务器上某个文件夹里的内容)显示为可下载链接的列表。这个过程是否安全是另一个问题,但假设我想这么做……

这篇帖子让我找到了正确的方向:Python目录列表返回到Django模板

这段代码如果在命令行中运行,会输出'myfiles'里的文件名:

path= os.path.dirname(os.path.abspath(__file__))  
myfiles = os.path.join(path, 'myfiles')  
os.chdir(myfiles)  
for files in os.listdir("."):
     print files  

但是我该如何将这些文件传递给Django模板,并生成一个链接列表呢?我想我可能需要创建一个Python字典或元组之类的东西,这样才能遍历它,然后作为模板变量传递,并在一个循环中渲染它?

我是否需要在我的urls.py文件中添加一个条目才能让这个工作?像这样吗?

(r'^myfiles/(?P<path>.*)$', 'django.views.static.serve', {'document_root': os.path.join(os.path.dirname(__file__), 'myfiles'), 'show_indexes': True}),

谢谢你的帮助!我刚开始学习,真的没法从网上现有的代码片段中弄明白该怎么做。

编辑:这是我在views.py中的代码:(你会注意到'\\',我在使用Windows系统)

def myfiles_page(request):
    path = os.path.dirname(os.path.abspath(__file__))
    myfiles = os.path.join(path, 'myfiles\\')
    os.chdir(myfiles)
    x = 0
    d = {}
    for file in os.listdir("."):
        d[x] = (myfiles + file)
        x = x + 1

    variables = RequestContext(request, {
    'user' : request.user,
    'filedict' : d,
    })
    return render_to_response('myfiles_page.html', variables)

这是我尝试在模板中显示的方式:(根据Django文档

{% for key, value in filedict %}
    {{ key }}: {{ value }}
{% endfor %}

但是'filedict'在模板中仍然没有显示任何内容。有什么想法吗?

1 个回答

15

我觉得这跟你想的完全不一样。

你可能需要在views.py里自己写一个函数 - 可以参考教程。

这个函数会用os.listdir把文件列表放到一个列表里。

然后把这个列表传递给模板,并用你写的模板进行渲染 - 参考教程。

在模板里,内容大概是这样的:

{% for file in filelist %}
  {{ file }}
{% endfor %}

你可以把任何东西放到上下文中传给模板。你可能还想传一个包含文件和网址的增强列表 - 也就是一个字典的列表,每个字典里有一个名字和一个网址。然后你的模板就可以是:

{% for file in filelist %}
  <a href="{{file.url}}">{{ file.name }}</a>
{% endfor %}

非常重要的安全警告

不要让用户通过在网址里输入路径来浏览文件,至少在没有认真检查的情况下不要这样做。因为他们可能会输入类似 /myfiles/../../notmyfiles/secret.txt 的路径,借此查看其他人的文件,只要在路径中加上点点(..)就能向上移动。

如果你不明白这个道理,那你可能不应该在任何不想被破坏的系统上编写这个代码,最好只在玩具系统上试试!

撰写回答