Ruta de la plantilla Django

90

Estoy siguiendo el tutorial en http://docs.djangoproject.com/en/dev/intro/tutorial02/#intro-tutorial02 en un entorno de Windows 7. Mi archivo de configuración es:

TEMPLATE_DIRS = (
    'C:/django-project/myapp/mytemplates/admin'
)

Obtuve el base_templatede la plantilla admin/base_site.htmldesde el directorio predeterminado de plantillas de administración de Django en el código fuente de Django mismo (django / contrib / admin / templates) en un subdirectorio de administración del directorio myapp como se indica en el tutorial.

No parece tener efecto por alguna razón. ¿Alguna pista de cuál podría ser el problema? ¿Tengo que sincronizar la base de datos?

shaytac
fuente

Respuestas:

183

Sé que esto no está en el tutorial de Django, y es una pena, pero es mejor configurar rutas relativas para las variables de ruta. Puedes configurarlo así:

import os.path

PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))

...

MEDIA_ROOT = os.path.join(PROJECT_PATH, 'media/')

TEMPLATE_DIRS = [
    os.path.join(PROJECT_PATH, 'templates/'),
]

De esta manera, puede mover su proyecto Django y las raíces de su ruta se actualizarán automáticamente. Esto es útil cuando está configurando su servidor de producción.

En segundo lugar, hay algo sospechoso en su ruta TEMPLATE_DIRS. Debería apuntar a la raíz de su directorio de plantillas. Además, también debería terminar en un final /.

Solo voy a adivinar aquí que el .../admin/directorio no es la raíz de su plantilla. Si aún desea escribir rutas absolutas, debe eliminar la referencia al directorio de plantillas de administración.

TEMPLATE_DIRS = [
    'C:/django-project/myapp/mytemplates/',
]

Dicho esto, los cargadores de plantillas de forma predeterminada deben configurarse para atravesar recursivamente los directorios de su aplicación para localizar archivos de plantilla.

TEMPLATE_LOADERS = [
    'django.template.loaders.filesystem.load_template_source',
    'django.template.loaders.app_directories.load_template_source',
    # 'django.template.loaders.eggs.load_template_source',
]

No debería necesitar copiar las plantillas de administración a menos que desee específicamente sobrescribir algo.

Tendrá que ejecutar un syncdb si aún no lo ha hecho. También necesitará un servidor estático de sus archivos multimedia si está alojando django a través de runserver.

soñador digital
fuente
1
muchas gracias quitando "/ admin" al final de la ruta relativa TEMPLATE_DIRS lo hizo.
shaytac
1
Esta sugerencia coloca el directorio de plantillas dentro de la carpeta del proyecto. Para una mejor organización, ¿tiene más sentido colocarlo dentro de la carpeta de una aplicación?
Sahas Katta
2
Esto solucionó mi problema. Gracias. PERO, el archivo de configuración predeterminado tenía un comentario con TEMPLATE_DIRS que decía: "No olvides usar rutas absolutas, no rutas relativas". ¿Alguien conoce la justificación de ese comentario?
bhekman
1
PROJECT_PATH es la ruta absoluta de la carpeta del proyecto. Este método establece la ruta de medios absoluta de forma dinámica en tiempo de ejecución para que el valor no esté codificado y pueda cambiar automáticamente con la ubicación del proyecto. Esta es una publicación antigua, pero puede usarla para definir la ubicación de cualquier carpeta o archivo en el proyecto.
digitaldreamer
2
Sugeriría usar os.path.joinpara agregar rutas al directorio base.
antonagestam
34

Si usa la configuración de Django tal como está instalada, ¿por qué no simplemente usar su BASE_DIR y PLANTILLAS predefinidos y integrados? En el pip instalado Django (v1.8), obtengo:

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


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            ### ADD YOUR DIRECTORY HERE LIKE SO:
            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',
            ],
        },
    },
]
NathanQ
fuente
1
este «BASE_DIR + '/ templates /',» hizo el truco. Y también se ve mucho más elegante que una sección separada.
Maxiller
2
utilizar os.path.join(BASE_DIR, 'templates')para que la ruta sea independiente de la plataforma.
Abhyudai
12

Solución inteligente en Django 2.0.3 para mantener plantillas en el directorio del proyecto ( /root/templates/app_name):

settings.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMP_DIR = os.path.join(BASE_DIR, 'templates')
...
TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [TEMP_DIR],
...

en views.py simplemente agregue dicha ruta de plantilla:

app_name/html_name
2RMalinowski
fuente
9

Para Django 1.6.6:

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
TEMPLATE_DIRS = os.path.join(BASE_DIR, 'templates')

También estático y multimedia para el modo de depuración y producción:

STATIC_URL = '/static/'
MEDIA_URL = '/media/'
if DEBUG:
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
else:
    STATIC_ROOT = %REAL_PATH_TO_PRODUCTION_STATIC_FOLDER%
    MEDIA_ROOT = %REAL_PATH_TO_PRODUCTION_MEDIA_FOLDER%

En urls.py debes agregar:

from django.conf.urls import patterns, include, url
from django.contrib import admin
from django.conf.urls.static import static
from django.conf import settings

from news.views import Index

admin.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    ...
    )

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

En Django 1.8 puede establecer rutas de plantilla, backend y otros parámetros para las plantillas en un diccionario ( settings.py ):

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            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',
            ],
        },
    },
]

Documentos oficiales.

Dunaevsky Maxim
fuente
La ruta de la plantilla debe ser una tupla: use este TEMPLATE_DIRS = (os.path.join (BASE_DIR, 'templates'),)
renderbox
6

También tuve problemas con esta parte del tutorial (tutorial usado para la versión 1.7).

Mi error fue que solo edité la cadena 'Administración de Django' y no presté suficiente atención al manual.

Esta es la línea de django / contrib / admin / templates / admin / base_site.html :

<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>

Pero después de algún tiempo y frustración, quedó claro que existía la declaración 'site_header o default: _', que debería eliminarse. Entonces, después de eliminar la declaración (como en el ejemplo del manual, todo funcionó como se esperaba).

Manual de ejemplo:

<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>
jpoppe
fuente
2

Está bien 😁 Digamos que usted tiene un nuevo proyecto, si así se va a ir al settings.pyarchivo y buscar TEMPLATESuna vez que lo has visto que acaba de pegar esta línea os.path.join(BASE_DIR, 'template')en 'DIRS'Al final, usted debe conseguir algunas cosas como esta:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'template')
        ],
        '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',
            ],
        },
    },
]

Si desea saber dónde se encuentra su directorio BASE_DIR, escriba estos 3 comandos simples:

python3 manage.py shell

Una vez que esté en el caparazón:

>>> from django.conf import settings
>>> settings.BASE_DIR

PD: Si le asignó otro nombre a la carpeta de su plantilla, también lo cambiaría aquí.


fuente
2

En django 3.1, vaya a la configuración de su proyecto e importe el sistema operativo

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',
            ],
        },
    },
]
Prabesh
fuente
1

En django 2.2 esto se explica aquí

https://docs.djangoproject.com/en/2.2/howto/overriding-templates/

import os

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

INSTALLED_APPS = [
    ...,
    'blog',
    ...,
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        ...
    },
]
soda
fuente
0

Básicamente BASE_DIRes el directorio del proyecto de django, el mismo directorio donde manage.pyestá.

    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',
                ],
            },
        },
    ]

Dave
fuente
0

Al contrario de algunas respuestas publicadas en este hilo, agregar 'DIRS': ['templates']no tiene ningún efecto ya que 'plantillas' es la ruta predeterminada donde Django busca plantillas.

Si está intentando hacer referencia a la plantilla de una aplicación, asegúrese de que su aplicación esté en la lista del INSTALLED_APPSproyecto principal settings.py.

INSTALLED_APPS': [
   # ...
   'my_app',
]
peterchaula
fuente