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

时间:2011-02-02 08:25:01

标签: python django filesystems django-templates repository

我只是在学习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 %}

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

1 个答案:

答案 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这样的东西。通过在路径中粘贴点点来查看其他人的文件。

如果你不明白这一点,那么你可能不应该把它编写在任何东西上,除了你不介意被撕成碎片的玩具系统!