Если у вас есть древовидная структура, то есть каталог, то вы можете превратить ваш цикл 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()
, используя yield
, возвращает не список подфайлов, а генератор, который выдаст результаты при вызове циклом for
в шаблоне.Это становится изящным танцем между _index()
и шаблонами визуализации.