2013-06-14 8 views
5

Erhalten Sie alle Vorlagen django erkennt aus TEMPLATE_LOADERS und TEMPLATE_DIRS

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

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

Ich versuche, eine Lösung zu finden, die den Inhalt meiner angegebenen Verzeichnis in jedem dieser Standorte (TEMPLATE_DIRS oder TEMPLATE_LOADERS) auflisten würde.

Ich brauche so etwas wie:

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

würde 'settings.TEMPLATE_DIRS + settings.TEMPLATE_LOADERS' nicht? – karthikr

+0

Ich kann über Einstellungen iterieren. TEMPLATE_DIRS, aber settings.TEMPLATE_LOADERS ist nur ein Tupel von Modulen, nicht dirs ... – Hernantz

Antwort

2

Da Vorlagen in verschachtelten Verzeichnissen unter den Basisvorlage Orten sein kann, würde ich mit os.walk empfehlen die Vorlagen erhalten Sie benötigen, ist es im Wesentlichen ein Wrapper für os.listdir, die folgen werden Verzeichnisse.

ist ein internes Tupel aller App-Vorlagenverzeichnisse und TEMPLATE_DIRS ist eine Einstellung, die von django.template.loaders.filesystem.Loader verwendet wird.

Der folgende Code eine Liste aller Dateien in der Vorlage Verzeichnisse erzeugen soll (diese nicht Template-Dateien enthalten könnte):

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)) 
+0

perfekt! Danke, – Hernantz

7

Falls jemand noch diese benötigt wird, ich bin mit 1.9.2 und es sieht aus wie app_template_dirs jetzt und settings.TEMPLATE_DIRS ist jetzt settings.TEMPLATES[0]['DIRS']

Hier ist, was ich getan habe:

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)) 

Dann können Sie durch die Liste durchlaufen, wie Sie mit template_list benötigen:

for template in template_list: 
    print template 
+0

Beachten Sie, dass '' template_list'', obwohl dies nützlich sein kann, eine Liste von Pfadnamen ist, die die vom DjangoTemplates-Backend verwendeten Dateien identifizieren, vorausgesetzt, es ist die erste der TEMPLATES-Einstellungen. Auf andere Vorlagen kann möglicherweise über andere Backends zugegriffen werden, und sie können andere Dateien verwenden oder nicht. In Django gibt es keine Möglichkeit, die Vorlagen-Backends ('Loader' für ältere Django-Versionen) zu verwenden, um alle möglichen Vorlagennamen aufzulisten, da die Auflistung der Namen nicht im Vorlagen-Backend-Protokoll definiert ist. –