2013-06-14 12 views
5

Uzyskaj wszystkie szablony django wykrywa od TEMPLATE_LOADERS i TEMPLATE_DIRS

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

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

Staram się znaleźć rozwiązanie, które byłoby wyświetlić zawartość mojego katalogu określonym w jednym z tych miejsc (TEMPLATE_DIRS lub TEMPLATE_LOADERS).

muszę coś takiego:

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

byłoby 'settings.TEMPLATE_DIRS + settings.TEMPLATE_LOADERS' nie działa? – karthikr

+0

Potrafię iterować po ustawieniach. TEMPLATE_DIRS, ale ustawienia.TEMPLATE_LOADERS to tylko tuple modułów, a nie dirs ... – Hernantz

Odpowiedz

2

Ponieważ szablony mogą być w zagnieżdżonych katalogów pod lokalizacjach szablon bazowy polecam korzystania os.walk dostać szablony można wymagać, jest zasadniczo otoki dla os.listdir że nastąpi katalogi.

django.template.loaders.app_directories.app_template_dirs jest wewnętrzną krotką wszystkich katalogów szablonów aplikacji, a TEMPLATE_DIRS to ustawienie używane przez django.template.loaders.filesystem.Loader.

Poniższy kod powinien wygenerować listę wszystkich dostępnych plików w katalogach szablonu (może to są w pliki szablonów):

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

perfect! dzięki – Hernantz

7

W przypadku ktoś jeszcze potrzebuje tego, biegnę 1.9.2 i wygląda na to, app_template_dirs jest teraz i settings.TEMPLATE_DIRS jest teraz settings.TEMPLATES[0]['DIRS']

Oto co zrobiłem:

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

Następnie można wykonać iterację listy, jak trzeba, używając template_list:

for template in template_list: 
    print template 
+0

Należy pamiętać, że chociaż może to być przydatne, '' template_list'' jest listą ścieżek identyfikujących pliki używane przez backend DjangoTemplates przy założeniu, że jest to pierwsze z ustawień SZABLONÓW. Inne szablony mogą być dostępne za pośrednictwem innych kopii zapasowych i mogą lub nie mogą korzystać z innych plików. W Django nie ma możliwości użycia szablonów zaplecza ("ładowników" dla starszych wersji django) do wyświetlenia wszystkich możliwych nazw szablonów, ponieważ lista nazw nie jest zdefiniowana w protokole backendu szablonu. –