Ver índice de contenidos del libro

10.3. Detalles internos de la carga de plantillas

En general las plantillas se almacenan en archivos en el sistema de archivos, pero puedes usar cargadores de plantillas personalizados (custom) para cargar plantillas desde otros orígenes.

Django tiene dos maneras de cargar plantillas:

  • django.template.loader.get_template(template): get_template retorna la plantilla compilada (un objeto Template) para la plantilla con el nombre provisto. Si la plantilla no existe, se generará una excepción TemplateDoesNotExist.
  • django.template.loader.select_template(template_name_list): select_template es similar a get-template, excepto que recibe una lista de nombres de plantillas. Retorna la primera plantilla de dicha lista que existe. Si ninguna de las plantillas existe se lanzará una excepción TemplateDoesNotExist.

Como se vio en el Capítulo 4, cada una de esas funciones usan por omisión el valor de tu variable de configuración TEMPLATE_DIRS para cargar las plantillas. Sin embargo, internamente las mismas delegan la tarea pesada a un cargador de plantillas.

Algunos de los cargadores están, por omisión, desactivados pero puedes activarlos editando la variable de configuración TEMPLATE_LOADERS. TEMPLATE_LOADERS debe ser una tupla de cadenas, donde cada cadena representa un cargador de plantillas. Estos son los cargadores de plantillas incluidos con Django:

1. django.template.loaders.filesystem.load_template_source: Este cargador carga plantillas desde el sistema de archivos, de acuerdo a TEMPLATE_DIRS. Por omisión está activo.

2. django.template.loaders.app_directories.load_template_source: Este cargador carga plantillas desde aplicaciones Django en el sistema de archivos. Para cada aplicación en INSTALLED_APPS, el cargador busca un sub-directorio templates. Si el directorio existe, Django buscará una plantilla en el mismo.

Esto significa que puedes almacenar plantillas en tus aplicaciones individuales, facilitando la distribución de aplicaciones Django con plantillas por omisión. Por ejemplo si INSTALLED_APPS contiene ('myproject.polls', 'myproject.music') entonces get_template('foo.html') buscará plantillas en el siguiente orden:

  • /path/to/myproject/polls/templates/foo.html
  • /path/to/myproject/music/templates/foo.html

Notar que el cargador realiza una optimización cuando es importado por primera vez: hace caching de una lista de cuales de los paquetes en INSTALLED_APPS tienen un sub-directorio templates.

Por omisión este cargador está activo.

3. django.template.loaders.eggs.load_template_source: Este cargador es básicamente idéntico a app_directories, excepto que carga las plantillas desde eggs Python en lugar de hacerlo desde el sistema de archivos. Por omisión este cargador está desactivado; necesitarás activarlo si estás usando eggs para distribuir tu aplicación.

Django usa los cargadores de plantillas en el orden en el que aparecen en la variable de configuración TEMPLATE_DIRS. Usará cada uno de los cargadores hasta que uno de los mismos tenga éxito en la búsqueda de la plantilla.