2012-04-30 10 views
6

que tienen la siguiente estructura de carpetas para las plantillas en mi aplicación Django:decirle a Django a buscar en las subcarpetas plantilla de aplicaciones

templates/ 
    app/ 
     model1/ 
     model1_form.html 
     model2/ 
     model2_form.html 

Supongamos que estoy usando model1 y un ListView genérico, en este momento sólo se busca en las plantillas/app/model1_form.html. ¿Hay alguna forma en que pueda decirle a django que también debe buscar en la aplicación/subcarpetas? No quiero tener que establecer manualmente el nombre y la ruta de la plantilla (template_name="templates/app/model1/model1_form.html").

En settings.py que tengo:

import os.path 
BASE_PATH = os.path.dirname(os.path.dirname(__file__)) 
TEMPLATE_DIRS = (
    BASE_PATH+'/templates/', 
) 

Este es mi punto de vista:

class HousesListView(ListView): 
    model = House 
    context_object_name = "house_list" 

Gracias de antemano!

Respuesta

19

es necesario agregar django.template.loaders.app_directories.Loader a TEMPLATE_LOADERS (si no lo es ya).

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

A continuación, cambiar la estructura de carpetas de tal manera que tiene una carpeta "plantillas" en el directorio de aplicación:

- <project_root> 
    - app 
     - templates 
      - model1 
      - model2 

O al espacio de nombres correctamente los modelos para que no entren en conflicto con otros nombres de aplicaciones accidental:

- <project_root> 
    - app 
     - templates 
      - app 
       - model1 
       - model2 
+3

Consulte la respuesta de Bob Vork para Django 1.8+ – horriblyUnpythonic

1

creo para usar plantillas de subcarpetas en general, que o bien tienen que:

  1. dar manualmente la ruta de plantilla como subdir/template.html
    por ejemplo. render_to_response ('sub/dir/template.html') o template_name = '...'

  2. definir todas las subcarpetas en la TEMPLATE_DIRS
    por ejemplo.

    TEMPLATE_DIRS = (
    base_path + '/ templates /',
    base_path + '/ templates/app',
    base_path + '/ templates/app/model1',
    )

    sino porque genéricos Vistas excepto plantillas que se pueden encontrar en nombre_aplic/template.html, , tendría que mover sus plantillas para agregar /path/to/templates/app/model1 a su TEMPLATE_DIRS, y mover sus plantillas a templates/your_app/model/your_app/model_template.html, lo cual es un poco incómodo.

+0

Probé el número 2, poniendo "templates/app/model1" en el TEMPLATE_DIR pero esto hace que django busque en "templates/app/model1/app/model1_form.html". ¿Qué quieres decir con el número 1? – Clash

+0

@Clash ¿Le dio las rutas absolutas, o relativas a su "plantilla-raíz"? Por 1. Me refería a llamar a las plantillas con la ruta completa, que no quería hacer? – varesa

+0

¿qué quieres decir con "modelo/template.html"? – Clash

18

las otras respuestas eran correctas en el momento, pero para cualquiera que venga a través de este momento, esto es cómo se hace esto en Django 1.8+

De forma predeterminada, Django ahora busca en las carpetas de aplicaciones las plantillas.Esto se indica mediante 'APP_DIRS': True, en el entorno TEMPLATES así:

TEMPLATES = [ 
    { 
    ... 
    'DIRS': ['templates'], 
    'APP_DIRS': True, 
    ... 
    }, 
] 

Como las otras respuestas indican, también debe utilizar appname/templates/appname/model1_form.html al espacio de nombres de las plantillas

(+ info: https://docs.djangoproject.com/en/1.8/intro/tutorial03/#write-views-that-actually-do-something en el cuadro titulado 'espacios de nombre del modelo ')

Verificación final: asegúrese de que la aplicación que está utilizando esté en la tupla INSTALLED_APPS, ya que ese era el problema que estaba teniendo.

+0

Bien hecho. "asegúrate de que la aplicación que estás utilizando esté en la tupla INSTALLED_APPS" – Private

0

Con Django 2.0, ni siquiera es necesario cambiar nada en la variable TEMPLATES en settings.py. El único requisito es agregar appname.apps.AppnameConfig (por ejemplo, catalog.apps.CatalogConfig para una aplicación llamada 'catálogo') a la lista INSTALLED_APPS, luego django buscará en plantillas/nombre de aplicación cuando busque plantillas.

Cuestiones relacionadas