我只是在学习Python& Django的。 (感谢所有在这里做出贡献的人 - 这是一个非常宝贵的资源!)
我遇到的一个看似基本的问题是将一个简单的静态文件列表(比如我服务器上单个存储库目录的内容)呈现为可下载链接列表。这是否安全是另一个问题,但假设我想这样做......
这篇文章帮助引导我朝着正确的方向前进: Python directory list returned to Django template
如果从提示符运行,此代码段将输出'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字典/元组以使其可迭代,将其作为模板变量传递并在for循环中呈现它?
我是否必须在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 documentation)
{% for key, value in filedict %}
{{ key }}: {{ value }}
{% endfor %}
但是'诉讼'仍然没有在模板中显示任何内容。有什么想法吗?
答案 0 :(得分:12)
我认为,非常不喜欢这样的东西。
您可能需要在views.py中创建自己的函数 - 请参阅教程。
该函数将os.listdir中的文件列表放入列表中。
将上下文中的列表传递给模板,并使用您编写的模板执行render_to_response - 请参阅教程。
在模板中,它的内容如下:
{% for file in filelist %}
{{ file }}
{% endfor %}
您可以将上下文中的任何内容传递给模板。您可能还希望传递带有URL的扩充文件列表 - 一个dicts列表,其中每个dict都有一个名称和一个url。然后你的模板是:
{% for file in filelist %}
<a href="{{file.url}}">{{ file.name }}</a>
{% endfor %}
大胖安全警告
不要让用户通过让他们在URL中放置路径来浏览文件,至少不是真的没有真正检查他们不能做像/myfiles/../../notmyfiles/secret.txt这样的东西。通过在路径中粘贴点点来查看其他人的文件。
如果你不明白这一点,那么你可能不应该把它编写在任何东西上,除了你不介意被撕成碎片的玩具系统!