仍然是一个新手...什么是Django呈现文件夹和文件树的方式?
在我看来,我已经使用os.walk列出可用的用户文件:
for (path, dirs, files) in os.walk(docroot, topdown=True):
#...do something here
现在我想渲染通过模板这些结果。 你会怎么办?
这是什么?
#...do something here
而模板中有什么?
仍然是一个新手...什么是Django呈现文件夹和文件树的方式?
在我看来,我已经使用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})
每个节点都是文件或文件夹。文件夹具有名称,所以在渲染文件夹时,我们将该文件夹和该文件夹中的条目列表(子文件)传递给该文件夹。使用yield
的_index()
函数不返回子文件列表,而是返回模板内由for
循环调用时生成结果的生成器。这成为_index()
和模板渲染器之间的漂亮舞蹈。
这是我在网站上遇到的最清晰的答案之一 - :) - 它确实说明了模板/视图关系如何与数据结构一起工作。我试图理解这一点。 – Dizzley 2011-06-09 19:37:52
Dizzley:由于我对os.walk不熟悉,因此我不明白它与递归解决方案的区别。这不适用于我的树的渲染;必须有不同的解决方案来使用它。所以我编辑了我的示例以显示如何使用listdir/isdir。我已经测试过这个,它工作。 – 2011-06-09 20:02:18
我赞赏递归解决方案,并且可以(粗略地)看到如何适应它...但您只是完成了所有工作。 :D – Dizzley 2011-06-09 20:13:28
我真的很感谢Elf的回答,但我会保持这个开放一段时间。 – Dizzley 2011-06-09 19:38:50