244 votes

Django TemplateDoesNotExist ?

Ma machine locale utilise Python 2.5 et Nginx sur Ubuntu 8.10, avec Django construit à partir du dernier tronc de développement.

Pour chaque URL que je demande, il lance :

TemplateDoesNotExist at /appname/path appname/template_name.html

Django a essayé de charger ces tem * Utilisation du chargeur django.template.loaders.filesystem.function : * Utilisation du chargeur django.template.loaders.app_directories.function :

T ('/usr/lib/python2.5/site-packages/projectname/templates',)

Cherche-t-il /usr/lib/python2.5/site-packages/projectname/templates/appname/template_name.html dans ce cas ? Ce qui est étrange, c'est que ce fichier existe bel et bien sur le disque. Pourquoi Django n'arrive-t-il pas à le localiser ?

Je fais tourner la même application sur un serveur distant avec Python 2.6 sur Ubuntu 9.04 sans ce problème. Les autres paramètres sont les mêmes.

Y a-t-il quelque chose de mal configuré sur ma machine locale, ou qu'est-ce qui aurait pu causer de telles erreurs et que je devrais vérifier ?

Dans mon settings.py Je l'ai précisé :

SETTINGS_PATH = os.path.normpath(os.path.dirname(__file__))
# Find templates in the same folder as settings.py.
TEMPLATE_DIRS = (
    os.path.join(SETTINGS_PATH, 'templates'),
)

Il doit rechercher les fichiers suivants :

  • /usr/lib/python2.5/site-packages/projectname/templates/appname1/template1.html
  • /usr/lib/python2.5/site-packages/projectname/templates/appname1/template2.html
  • /usr/lib/python2.5/site-packages/projectname/templates/appname2/template3.html
  • ...

Tous les fichiers ci-dessus existent sur le disque.

Résolu

Cela fonctionne maintenant après avoir essayé :

chown -R www-data:www-data /usr/lib/python2.5/site-packages/projectname/*

C'est étrange. Je n'ai pas besoin de faire cela sur le serveur distant pour que cela fonctionne.

266voto

jpartogi Points 8253

Première solution :

Ces paramètres

TEMPLATE_DIRS = (
    os.path.join(SETTINGS_PATH, 'templates'),
)

signifie que Django examinera les modèles de templates/ sous votre projet.

En supposant que votre projet Django se trouve à l'adresse suivante /usr/lib/python2.5/site-packages/projectname/ puis, avec vos paramètres, django cherchera les modèles sous /usr/lib/python2.5/site-packages/projectname/templates/

Dans ce cas, nous voulons que nos modèles soient structurés de la manière suivante :

/usr/lib/python2.5/site-packages/projectname/templates/template1.html
/usr/lib/python2.5/site-packages/projectname/templates/template2.html
/usr/lib/python2.5/site-packages/projectname/templates/template3.html

Deuxième solution :

Si cela ne fonctionne toujours pas et en supposant que vous avez configuré les applications dans settings.py comme ceci :

INSTALLED_APPS = (
    'appname1',
    'appname2',
    'appname3',
)

Par défaut, Django charge les modèles sous templates/ sous chaque application installée. Ainsi, avec votre structure de répertoire, nous voulons déplacer nos modèles pour qu'ils ressemblent à ceci :

/usr/lib/python2.5/site-packages/projectname/appname1/templates/template1.html
/usr/lib/python2.5/site-packages/projectname/appname2/templates/template2.html
/usr/lib/python2.5/site-packages/projectname/appname3/templates/template3.html

SETTINGS_PATH peut ne pas être défini par défaut. Dans ce cas, vous devrez le définir (dans settings.py) :

import os
SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__))

93voto

Bacs Points 925

Trouver ce tuple :

    import os
    SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__))

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

Vous devez ajouter à 'DIRS' la chaîne de caractères

os.path.join(BASE_DIR, 'templates')

Il vous faut donc en tout et pour tout :

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

80voto

W.Perrin Points 381

Si vous rencontrez ce problème lorsque vous ajoutez un app à partir de zéro. C'est probablement parce qu'il vous manque des settings . Trois étapes sont nécessaires pour ajouter un app .

1、Créer le répertoire et le fichier modèle.

Supposons que vous ayez un projet nommé mysite et vous souhaitez ajouter un app nommée your_app_name . Placez votre fichier modèle sous mysite/your_app_name/templates/your_app_name comme suit.

├── mysite
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── your_app_name
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── templates
│   │   └── your_app_name
│   │       └── my_index.html
│   ├── urls.py
│   └── views.py

2、Ajouter votre app à INSTALLED_APPS .

Modifier settings.py

INSTALLED_APPS = [
    ...
    'your_app_name',
    ...
]

3、Ajouter votre app dans le répertoire DIRS en TEMPLATES .

Modifier settings.py .

Ajouter l'importation d'os

import os
TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates'),
                 os.path.join(BASE_DIR, 'your_app_name', 'templates', 'your_app_name'),
                ...
                ]
    }
]

15voto

jaynt singh Points 16

Dans le fichier .py supprimer TEMPLATE_LOADERS et TEMPLATE DIRS Alors ADD

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

11voto

Chris Conlan Points 965

J'ai eu un problème embarrassant...

J'ai obtenu cette erreur parce que j'étais pressé et que j'ai oublié de mettre l'application en place INSTALLED_APPS . On pourrait penser que Django génère une erreur plus descriptive.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X