usar plantillas para descargar bootstrap django templates

plantillas - Vista de Django: cargar la plantilla desde el directorio de la aplicación que llama



django templates bootstrap (3)

El app_loader busca plantillas dentro de sus aplicaciones para que estén especificadas en su INSTALLED_APPS. ( http://docs.djangoproject.com/en/dev/ref/templates/api/#loader-types ).

Mi sugerencia es preceder el nombre de su archivo de plantilla con el nombre de la aplicación para evitar estos conflictos de nombres.

Por ejemplo, el directorio de plantilla para la aplicación1 se vería así:

templates/ app1_index.html app1_delete.html app1_add.html app1_create.html

Intento mantener un esquema de nombres algo consistente en mis plantillas HTML. Es decir, index.html para main, delete.html para eliminar página y así sucesivamente. Pero el cargador app_directories siempre parece cargar la plantilla desde la aplicación que está en primer lugar alfabéticamente.

¿Hay alguna forma de comprobar siempre si hay una coincidencia en el directorio de templates la aplicación que llama primero?

Configuraciones relevantes en mi settings.py :

PROJECT_PATH = os.path.realpath(os.path.dirname(__file__)) TEMPLATE_LOADERS = ( ''django.template.loaders.app_directories.load_template_source'', ''django.template.loaders.filesystem.load_template_source'', ) TEMPLATE_DIRS = ( os.path.join(PROJECT_PATH, ''templates''), )

Intenté cambiar el orden de TEMPLATE_LOADERS , sin éxito.

Editar según lo solicitado por Ashok:

Estructura de directorios de cada aplicación:

templates/ index.html add.html delete.html create.html models.py test.py admin.py views.py

En views.py de cada aplicación:

def index(request): # code... return render_to_response(''index.html'', locals()) def add(request): # code... return render_to_response(''add.html'', locals()) def delete(request): # code... return render_to_response(''delete.html'', locals()) def update(request): # code... return render_to_response(''update.html'', locals())


La razón para esto es que el cargador app_directories es esencialmente lo mismo que agregar la carpeta de plantillas de cada aplicación a la configuración TEMPLATE_DIRS, por ejemplo, como

TEMPLATE_DIRS = ( os.path.join(PROJECT_PATH, ''app1'', ''templates''), os.path.join(PROJECT_PATH, ''app2'', ''template''), ... os.path.join(PROJECT_PATH, ''templates''), )

El problema con esto es que, como mencionaste, index.html siempre se encontrará en app1 / templates / index.html en lugar de en cualquier otra aplicación. No existe una solución fácil para corregir mágicamente este comportamiento sin modificar el cargador de los ejecutables de la aplicación y el uso de la introspección o la transmisión de la información de la aplicación, lo que se complica un poco. Una solución más fácil:

  • Mantenga su settings.py como está
  • Agregue un subdirectorio en la carpeta de plantillas de cada aplicación con el nombre de la aplicación
  • Use las plantillas en vistas como ''app1 / index.html'' o ''app2 / index.html''

Para un ejemplo más concreto:

project app1 templates app1 index.html add.html ... models.py views.py ... app2 ...

Luego en las vistas:

def index(request): return render_to_response(''app1/index.html'', locals())

Incluso podría escribir un contenedor para automatizar anteponiendo el nombre de la aplicación a todas sus vistas, e incluso eso podría extenderse para usar introspección, por ejemplo:

def render(template, data=None): return render_to_response(__name__.split(".")[-2] + ''/'' + template, data) def index(request): return render(''index.html'', locals())

El _____ nombre _____. Split (".") [- 2] asume que el archivo está dentro de un paquete, por lo que convertirá, por ejemplo, ''app1.views'' en ''app1'' para anteponer al nombre de la plantilla. Esto también supone que un usuario nunca cambiará el nombre de su aplicación sin cambiar el nombre de la carpeta en el directorio de plantillas, lo que puede no ser una suposición segura y, en ese caso, solo codificará el nombre de la carpeta en el directorio de plantillas.


Sé que este es un hilo viejo, pero hice algo reutilizable, que permite un espacio de nombres más simple. Puede cargar lo siguiente como un Cargador de plantillas. Encontrará appname/index.html en appname/templates/index.html .

Gist disponible aquí: https://gist.github.com/871567

""" Wrapper for loading templates from "templates" directories in INSTALLED_APPS packages, prefixed by the appname for namespacing. This loader finds `appname/templates/index.html` when looking for something of the form `appname/index.html`. """ from django.template import TemplateDoesNotExist from django.template.loaders.app_directories import app_template_dirs, Loader as BaseAppLoader class Loader(BaseAppLoader): '''''' Modified AppDirecotry Template Loader that allows namespacing templates with the name of their app, without requiring an extra subdirectory in the form of `appname/templates/appname`. '''''' def load_template_source(self, template_name, template_dirs=None): try: app_name, template_path = template_name.split(''/'', 1) except ValueError: raise TemplateDoesNotExist(template_name) if not template_dirs: template_dirs = (d for d in app_template_dirs if d.endswith(''/%s/templates'' % app_name)) return iter(super(Loader, self).load_template_source(template_path, template_dirs))