¿Cuál es la mejor ubicación para colocar plantillas en el proyecto django?

89

¿Cuál es la mejor ubicación para colocar plantillas en el proyecto django?

Vishal
fuente

Respuestas:

50

Del libro de Django, capítulo 4 :

Si no puede pensar en un lugar obvio para colocar sus plantillas, le recomendamos que cree un directorio de plantillas dentro de su proyecto Django (es decir, dentro del directorio mysite que creó en el Capítulo 2, si ha seguido nuestros ejemplos).

Esto es exactamente lo que hago y me ha funcionado muy bien.

Mi estructura de directorio se parece a esto:

/mediapara todos mis CSS / JS / imágenes, etc.
/templatespara mis plantillas
/projectnamepara el código del proyecto principal (es decir, el código Python)

Dominic Rodger
fuente
1
cuando pones las plantillas en / templates, ¿hay alguna manera de decirle al cargador de plantillas que las cargue sin especificar la ruta completa a / template en TEMPLATE_DIRS para cargar con django.template.loaders.filesystem.Loader? Sería genial hacer esto con una ruta relativa, y en 1.4 mi cargador no está buscando en <proyecto> / templates
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
87

Colocado <PROJECT>/<APP>/templates/<APP>/template.htmlpara plantillas específicas de la aplicación para ayudar a hacer que la aplicación sea reutilizable en otros lugares.

Para las plantillas "globales" generales, las coloco en <PROJECT>/templates/template.html

polvo
fuente
11
¿Se pregunta el motivo de 2 <APP>s en <PROJECT>/<APP>/templates/<APP>/template.html?
David Xia
18
La primera / app / templates es solo para agrupar plantillas con su aplicación relevante. La segunda aplicación es para evitar colisiones de nombres. (Presumiblemente, apuntará TEMPLATE_DIRS para que apunte a cada uno de estos directorios, pero al final, Django los agrupa en un directorio gigante). Ver: docs.djangoproject.com/en/dev/ref/templates/api/…
Ceasar Bautista
3
Para que esto funcione (django 1.6), tuve que agregar una directiva para el cargador de plantillas del sistema de archivos:TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
Fafaman
3
Esta respuesta es antigua, pero de alguna manera terminé aquí. Para el registro, TEMPLATE_DIRSahora está en desuso; en su lugar, debería agregarlo DIRS=[os.path.join(BASE_DIR, "templates")]a TEMPLATES; consulte stackoverflow.com/questions/29725132/…
John Aaron
9

Siguiendo a Dominic y Dlrust,

Usamos una distribución de origen de setuptools (sdist) para empaquetar nuestro proyecto django y aplicaciones para implementar en nuestros diferentes entornos.

Hemos descubierto que las plantillas y los archivos estáticos deben estar en los directorios de la aplicación django para que puedan ser empaquetados por setuptools.

Por ejemplo, nuestra plantilla y rutas estáticas se ven así:

PROJECT/APP/templates/APP/template.html
PROJECT/APP/static/APP/my.js

Para que esto funcione, es necesario modificar MANIFEST.in (consulte http://docs.python.org/distutils/sourcedist.html#the-manifest-in-template )

Un ejemplo de MANIFEST.in:

include setup.py
recursive-include PROJECT *.txt *.html *.js
recursive-include PROJECT *.css *.js *.png *.gif *.bmp *.ico *.jpg *.jpeg

Además, debe confirmar en su archivo de configuración de django que el cargador de app_directories está en su TEMPLATE_LOADERS. Creo que está ahí de forma predeterminada en django 1.4.

Un ejemplo de los cargadores de plantillas de configuración de django:

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
)

En caso de que se esté preguntando por qué usamos sdists en lugar de simplemente hacer frente a archivos rsync; es parte de nuestro flujo de trabajo de gestión de la configuración, donde tenemos un solo tarball de compilación que se implementa con PIP sin cambios en los entornos de prueba, aceptación y producción.

thesurfinganalyst
fuente
1
+1 Gracias por proporcionar detalles adicionales y líneas de ejemplo.
gotgenes
+1 inteligente para incluir /static/en su plan de diseño al pensar en plantillas y aplicaciones modulares. Es posible que desee mencionar otra práctica recomendada, colocar los cssarchivos en una carpeta llamada static/app/cssigualmente para jsy tal vez jpgo simplemente /static/app/images.
placas el
7

DJANGO 1.11

agregue la carpeta de plantillas donde existe manage.py, que es su directorio base. cambie el DIRS por PLANTILLAS como sigue en su configuración.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(BASE_DIR, 'templates')],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
        ],
    },
},

]

Ahora para usar la plantilla usando el código,

def home(request):
    return render(request,"index.html",{})

en views.py. esto funciona completamente bien para django 1.11

Alan Paul
fuente
1

Esta es una elección más personal a nivel de proyecto. Si está hablando de aplicaciones que necesitan ser conectables, entonces un directorio de plantillas en su aplicación es el lugar donde van por defecto. Pero en todo el proyecto, es lo que funciona mejor para usted.

SleighBoy
fuente
1

Entendí que TEMPLATE_DIRSrequiere un camino absoluto. Y no me gustan las rutas absolutas en mi código. Entonces esto está funcionando bien para mí, en settings.py:

import os

TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(os.path.realpath(__file__)),
                 "../APPNAME/templates")
)
kqw
fuente
1
Los proyectos de Django ya tienen su ruta base definida en el settings.py estándar como BASE_DIR, por lo que puede simplificar esto a:os.path.join(BASE_DIR, '../APPNAME/templates')
ngoue
1

Django 1.10

TEMPLATE_DIRS es obsoleto.

Ahora necesitamos usar TEMPLATE, introduciendo en Django 1.8 así:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            # ... some options here ...
        },
    },
]

Una vez que haya definido TEMPLATES, puede eliminar de forma segura ALLOWED_INCLUDE_ROOTS, TEMPLATE_CONTEXT_PROCESSORS, TEMPLATE_DEBUG, TEMPLATE_DIRS, TEMPLATE_LOADERS y TEMPLATE_STRING_IF_INVALID.

Acerca de la mejor ubicación, Django busca una plantilla como esta:

  • DIRS define una lista de directorios donde el motor debe buscar archivos fuente de plantilla, en orden de búsqueda.
  • APP_DIRS indica si el motor debe buscar plantillas dentro de las aplicaciones instaladas. Cada backend define un nombre convencional para el subdirectorio dentro de las aplicaciones donde se deben almacenar sus plantillas.

Más información: https://docs.djangoproject.com/en/1.10/topics/templates/#configuration

Wilfried
fuente
0

La solución anterior no funcionó en mi caso. Solía:

TEMPLATE_DIRS = [ os.path.join(os.path.dirname(os.path.realpath(__file__)),"../myapp/templates") ]
usuario6916739
fuente
Mira mi respuesta. TEMPLATE_DIRSahora está en desuso.
Wilfried
Los proyectos de Django ya tienen su ruta base definida en el settings.py estándar como BASE_DIR, por lo que puede simplificar esto a:os.path.join(BASE_DIR, '../myapp/templates')
ngoue
0

También podría considerar tener sus plantillas en una base de datos, usando django-dbtemplates . También está configurado para el almacenamiento en caché y la aplicación django-reversion que te ayuda a mantener las versiones antiguas de tus plantillas.

Funciona bastante bien, pero preferiría un poco más de flexibilidad en la importación / sincronización hacia / desde el lado del sistema de archivos.

[editar: 20 de agosto de 2018: este repositorio no está disponible, uno con el mismo nombre está disponible en https://github.com/jazzband/django-dbtemplates y se actualizó hace 8 meses. Ya no uso Django de manera significativa, así que no puedo responder por esto.]

TonyM
fuente
¿Cuándo sería una buena idea? ¿No es más lento cargar plantillas desde la base de datos?
jguffey
¿No se vuelve dependiente de db si almacena plantillas en db plus, hará que su db forme parte de git commits? ¿Cómo coordinará los cambios realizados por diferentes usuarios en las plantillas?
gautamaggarwal
Esto fue escrito mucho antes de que me diera cuenta de git. Ni siquiera estoy seguro de estar usando svn en ese momento. Recomiendo usar sistemas de control de versiones ahora.
TonyM
@tonemcd, este repositorio ha sido eliminado.
lmiguelvargasf