仍然是一個新手...什麼是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