还是新手。。。
在我看来,我使用 os.walk 列出了可用的用户文件:
for (path, dirs, files) in os.walk(docroot, topdown=True):
#...do something here
现在我想通过模板渲染这些结果。你会怎么做?
这里有什么?
#...do something here
模板中有什么?
如果你有一个树结构,也就是一个目录,那么你可以将你的 for() 循环变成一个生成器,并让它根据需要递归地调用自己。您将需要两个模板(一个用于文件,一个用于文件夹)和一个为每个文件夹创建生成器的视图。
这是一个文件模板:
<li>{{ file }}</li>
这是一个文件夹模板:
<li>{{ file }}<ul>{% for f in subfiles %}{{ f }}{% endfor %}</ul></li>
在您的主模板中,您需要一个根文件夹的起始列表:
<ul>{% for f in subfiles %}{{ f }}{% endfor %}</ul>
这是视图。此示例使用 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})
每个节点要么是一个文件,要么是一个文件夹。文件夹有名称,因此在渲染文件夹时,我们会传递该文件夹以及该文件夹中的条目(子项)列表。_index()
通过 using ,该函数yield
返回的不是子文件列表,而是一个生成器,当for
模板内的循环调用该生成器时,该生成器将生成结果。这变成了_index()
模板渲染器和模板渲染器之间的美妙舞蹈。