10

TEMPLATE_DIRS = ('/path/to/templates/',)

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
)

TEMPLATE_DIRS我正在尝试找到一种解决方案,该解决方案可以在这些位置(或TEMPLATE_LOADERS)中的任何一个中列出我指定目录的内容。

我需要类似的东西:

template_files = []
for dir in EVERY_DIRECTORY_DJANGO_LOOKS_FOR_TEMPLATES_IN:
    template_files.append(os.listdir(dir))
4

3 回答 3

15

如果有人仍然需要这个,我正在运行 1.9.2,它看起来就像 app_template_dirs现在get_app_template_dirssettings.TEMPLATE_DIRS现在settings.TEMPLATES[0]['DIRS']

这是我所做的:

from django.conf import settings
from django.template.loaders.app_directories import get_app_template_dirs
import os

template_dir_list = []
for template_dir in get_app_template_dirs('templates'):
    if settings.ROOT_DIR in template_dir:
        template_dir_list.append(template_dir)


template_list = []
for template_dir in (template_dir_list + settings.TEMPLATES[0]['DIRS']):
    for base_dir, dirnames, filenames in os.walk(template_dir):
        for filename in filenames:
            template_list.append(os.path.join(base_dir, filename))

然后,您可以根据需要使用 template_list 遍历列表:

for template in template_list:
    print template
于 2016-03-02T22:54:34.720 回答
4

由于模板可以位于基本模板位置下的嵌套目录中,我建议使用os.walk来获取您需要的模板,它本质上是一个包装器os.listdir,它将跟随目录。

django.template.loaders.app_directories.app_template_dirs是所有应用程序模板目录的内部元组,并且TEMPLATE_DIRS是由django.template.loaders.filesystem.Loader.

以下代码应生成模板目录中所有可用文件的列表(这可能包括非模板文件):

from django.conf import settings
from django.template.loaders.app_directories import app_template_dirs

import os

template_files = []
for template_dir in (settings.TEMPLATE_DIRS + app_template_dirs):
    for dir, dirnames, filenames in os.walk(template_dir):
        for filename in filenames:
            template_files.append(os.path.join(dir, filename))
于 2013-06-14T16:24:17.027 回答
0

使用 Django 的模板加载器返回所有路径的列表,然后使用 pathlib 到 blob (recurisvely) 向下每个目录查找所有.html文件:

from pathlib import Path

from django import template as django_template


def get_all_templates_files():
    dirs = []
    for engine in django_template.loader.engines.all():
        # Exclude pip installed site package template dirs
        dirs.extend(x for x in engine.template_dirs if 'site-packages' not in str(x))
    files = []
    for dir in dirs:
        files.extend(x for x in Path(dir).glob('**/*.html') if x)
    return files
于 2021-11-23T08:34:05.037 回答