Chemin du modèle Django

87

Je suis le tutoriel sur http://docs.djangoproject.com/en/dev/intro/tutorial02/#intro-tutorial02 dans un environnement Windows 7. Mon fichier de paramètres est:

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

J'ai obtenu le base_templatedepuis le modèle admin/base_site.htmldepuis le répertoire de modèle d'administration par défaut de Django dans le code source de Django lui-même (django / contrib / admin / templates) dans un sous-répertoire admin du répertoire myapp comme indiqué dans le didacticiel.

Cela ne semble pas avoir d'effet pour une raison quelconque. Une idée de quel pourrait être le problème? Dois-je faire une synchronisation db?

shaytac
la source

Réponses:

182

Je sais que ce n'est pas dans le didacticiel Django, et c'est dommage, mais il est préférable de définir des chemins relatifs pour vos variables de chemin. Vous pouvez le configurer comme ceci:

import os

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

...

MEDIA_ROOT = PROJECT_PATH + '/media/'

TEMPLATE_DIRS = (
    PROJECT_PATH + '/templates/',
)

De cette façon, vous pouvez déplacer votre projet Django et les racines de votre chemin se mettront à jour automatiquement. Ceci est utile lorsque vous configurez votre serveur de production.

Deuxièmement, il y a quelque chose de suspect dans votre chemin TEMPLATE_DIRS. Il doit pointer vers la racine de votre répertoire de modèles. En outre, il devrait également se terminer par un suivi /.

Je vais juste deviner ici que le .../admin/répertoire n'est pas votre racine de modèle. Si vous souhaitez toujours écrire des chemins absolus, vous devez supprimer la référence au répertoire du modèle d'administration.

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

Cela étant dit, les chargeurs de modèles par défaut doivent être configurés pour parcourir de manière récursive dans les répertoires de vos applications pour localiser les fichiers de modèle.

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.load_template_source',
    'django.template.loaders.app_directories.load_template_source',
#     'django.template.loaders.eggs.load_template_source',
)

Vous ne devriez pas avoir besoin de copier les modèles d'administration, sauf si vous souhaitez spécifiquement écraser quelque chose.

Vous devrez exécuter un syncdb si vous ne l'avez pas encore exécuté. Vous devrez également serveur statiquement vos fichiers multimédias si vous hébergez django via runserver.

rêveur numérique
la source
1
merci beaucoup de supprimer "/ admin" à la fin du chemin relatif TEMPLATE_DIRS l'a fait.
shaytac
1
Cette suggestion place le répertoire des modèles dans le dossier du projet. Pour une meilleure organisation, est-il plus judicieux de le placer dans le dossier d'une application à la place?
Sahas Katta
2
Cela a résolu mon problème. Merci. MAIS, le fichier de paramètres par défaut contenait un commentaire avec TEMPLATE_DIRS disant: "N'oubliez pas d'utiliser des chemins absolus, pas des chemins relatifs." Quelqu'un connaît-il la justification de ce commentaire?
bhekman
1
PROJECT_PATH est le chemin absolu du dossier du projet. Cette méthode définit le chemin d'accès multimédia absolu de manière dynamique au moment de l'exécution afin que la valeur ne soit pas codée en dur et puisse changer automatiquement avec l'emplacement du projet. Il s'agit d'un ancien article, mais vous pouvez l'utiliser pour définir l'emplacement de n'importe quel dossier ou fichier dans le projet.
digitaldreamer
2
Je suggérerais d'utiliser os.path.joinpour ajouter des chemins au répertoire de base.
antonagestam
34

Si vous utilisez les paramètres Django tels qu'installés, pourquoi ne pas utiliser simplement son BASE_DIR et ses TEMPLATES intégrés et prédéfinis? Dans le pip Django installé (v1.8), j'obtiens:

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
la source
1
ce «BASE_DIR + '/ templates /',» a fait l'affaire. Et cela a l'air beaucoup plus élégant, plutôt qu'une section séparée, aussi.
Maxiller
1
à utiliser os.path.join(BASE_DIR, 'templates')pour que le chemin soit indépendant de la plate-forme.
Abhyudai
10

Solution intelligente dans Django 2.0.3 pour conserver les modèles dans le répertoire du projet (/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],
...

dans views.py ajoutez simplement un tel chemin de modèle:

app_name/html_name
2RMalinowski
la source
8

Pour Django 1.6.6:

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

Aussi statique et média pour le débogage et le mode production:

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%

Dans urls.py, vous devez ajouter:

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)

Dans Django 1.8, vous pouvez définir les chemins des modèles, le backend et d'autres paramètres pour les modèles dans un dictionnaire ( 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',
            ],
        },
    },
]

Documents officiels.

Dunaevsky Maxim
la source
Le chemin du modèle doit être un tuple: utilisez ce TEMPLATE_DIRS = (os.path.join (BASE_DIR, 'templates'),)
renderbox
6

J'ai également eu des problèmes avec cette partie du tutoriel (tutoriel utilisé pour la version 1.7).

Mon erreur a été que je n'ai édité que la chaîne «administration Django» et que je n'ai pas prêté suffisamment d'attention au manuel.

Voici la ligne 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>

Mais après un certain temps et de la frustration, il est devenu clair qu'il y avait l'instruction 'site_header ou default: _', qui devrait être supprimée. Donc, après avoir supprimé l'instruction (comme l'exemple du manuel, tout a fonctionné comme prévu).

Exemple de manuel:

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

D'accord 😁 Disons que vous avez un tout nouveau projet, si c'est le cas, vous iriez au settings.pyfichier et le rechercher une TEMPLATESfois que vous l'avez trouvé, il vous suffit de coller cette ligne os.path.join(BASE_DIR, 'template')à 'DIRS'la fin, vous devriez obtenir quelque chose comme ceci:

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 vous voulez savoir où se trouve votre répertoire BASE_DIR, tapez ces 3 commandes simples:

python3 manage.py shell

Une fois que vous êtes dans la coquille:

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

PS: Si vous avez nommé votre dossier de modèles avec un autre nom, vous le changeriez ici aussi.


la source
1

Dans django 2.2, ceci est expliqué ici

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,
        ...
    },
]
un soda
la source
1

Dans django 3.1, allez dans les paramètres de votre projet et importez le système d'exploitation

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
la source
0

BASE_DIRest essentiellement le répertoire de votre projet django, le même répertoire où se manage.pytrouve.

    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
la source