在Django模板中列出目录文件内容
我正在学习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 个回答
我觉得这跟你想的完全不一样。
你可能需要在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 的路径,借此查看其他人的文件,只要在路径中加上点点(..)就能向上移动。
如果你不明白这个道理,那你可能不应该在任何不想被破坏的系统上编写这个代码,最好只在玩具系统上试试!