什么是Django渲染文件夹和文件树的方法?

Diz*_*ley 2 django os.walk

还是新手......

在我看来,我使用os.walk列出了可用的用户文件:

for (path, dirs, files) in os.walk(docroot, topdown=True):
    #...do something here
Run Code Online (Sandbox Code Playgroud)

现在我想通过模板渲染这些结果.你会怎么做?

什么在这里?

#...do something here
Run Code Online (Sandbox Code Playgroud)

什么在模板中?

Elf*_*erg 6

如果你有一个目录所在的树结构,那么你可以将你的for()循环变成一个生成器,让它根据需要递归调用它自己.您需要两个模板(一个用于文件,一个用于文件夹),以及一个为每个文件夹创建生成器的视图.

这是一个文件模板:

<li>{{ file }}</li>
Run Code Online (Sandbox Code Playgroud)

这是一个文件夹模板:

<li>{{ file }}<ul>{% for f in subfiles %}{{ f }}{% endfor %}</ul></li>
Run Code Online (Sandbox Code Playgroud)

在主模板中,您需要根文件夹的起始列表:

<ul>{% for f in subfiles %}{{ f }}{% endfor %}</ul>
Run Code Online (Sandbox Code Playgroud)

这是观点.此示例使用Treebeard,但分支/叶子的逻辑与文件夹/文件相同:

from django.template import loader

def index(request):
    def index_maker():
        def _index(root):
            files = os.listdir(root)
            for mfile in files:
                t = os.path.join(root, mfile)
                if os.path.isdir(t):
                     yield loader.render_to_string('demo/p_folder.html',
                                                   {'file': mfile,
                                                    'subfiles': _index(os.path.join(root, t))})
                     continue
                 yield loader.render_to_string('demo/p_file.html',
                                               {'file': mfile})
        return _index('/home/httpd/htdocs')

    c = index_maker()
    return render_to_response('demo/index.html',
                               {'subfiles': c})
Run Code Online (Sandbox Code Playgroud)

每个节点都是文件或文件夹.文件夹具有名称,因此在渲染文件夹时,我们会传递该文件夹以及该文件夹中的条目(子项)列表.该_index()函数通过使用yield,不返回子文件列表,而是返回一个生成器,当for模板中的循环调用时,它将生成结果.这变成了_index()模板渲染器之间的美妙舞蹈.