首页 文章

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

提问于
浏览
7

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

但是''sentict'仍然没有在模板中显示任何内容 . 有任何想法吗?

1 回答

  • 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这样的东西并看到其他人的情况下文件只是通过在路径中粘贴点点向上 .

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

相关问题