Что такое Django способ визуализации дерева папок и файлов? - PullRequest
2 голосов
/ 09 июня 2011

Все еще новичок ...

На мой взгляд, я использовал os.walk для просмотра списка доступных пользовательских файлов:

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

Теперь я хочу отобразить эти результаты с помощью шаблона.Как бы вы сделали это?

Что здесь?

#...do something here

А что в шаблоне?

1 Ответ

6 голосов
/ 09 июня 2011

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

...