¿Cuál es la mejor ubicación para colocar plantillas en el proyecto django?
89
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:
/media
para todos mis CSS / JS / imágenes, etc.
/templates
para mis plantillas
/projectname
para el código del proyecto principal (es decir, el código Python)
Colocado
<PROJECT>/<APP>/templates/<APP>/template.html
para 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
fuente
<APP>
s en<PROJECT>/<APP>/templates/<APP>/template.html
?TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
TEMPLATE_DIRS
ahora está en desuso; en su lugar, debería agregarloDIRS=[os.path.join(BASE_DIR, "templates")]
aTEMPLATES
; consulte stackoverflow.com/questions/29725132/…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.
fuente
/static/
en su plan de diseño al pensar en plantillas y aplicaciones modulares. Es posible que desee mencionar otra práctica recomendada, colocar loscss
archivos en una carpeta llamadastatic/app/css
igualmente parajs
y tal vezjpg
o simplemente/static/app/images
.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
fuente
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.
fuente
Entendí que
TEMPLATE_DIRS
requiere un camino absoluto. Y no me gustan las rutas absolutas en mi código. Entonces esto está funcionando bien para mí, ensettings.py
:import os TEMPLATE_DIRS = ( os.path.join(os.path.dirname(os.path.realpath(__file__)), "../APPNAME/templates") )
fuente
BASE_DIR
, por lo que puede simplificar esto a:os.path.join(BASE_DIR, '../APPNAME/templates')
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 ... }, }, ]
Acerca de la mejor ubicación, Django busca una plantilla como esta:
Más información: https://docs.djangoproject.com/en/1.10/topics/templates/#configuration
fuente
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") ]
fuente
TEMPLATE_DIRS
ahora está en desuso.BASE_DIR
, por lo que puede simplificar esto a:os.path.join(BASE_DIR, '../myapp/templates')
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.]
fuente