Django TemplateDoesNotExist?

163

Ma machine locale exécute 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 jette:

TemplateDoesNotExist at / appname / path appname / template_name.html

Django a essayé de charger ces modèles, dans cet ordre: * Utilisation du loader django.template.loaders.filesystem.function: * Utilisation du loader django.template.loaders.app_directories.function:

TEMPLATE_DIRS ('/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? La chose étrange est que ce fichier existait sur le disque. Pourquoi Django ne peut-il pas le localiser?

Je lance la même application sur un serveur distant avec Python 2.6 sur Ubuntu 9.04 sans un tel problème. Les autres paramètres sont identiques.

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

Dans mon settings.py , j'ai spécifié:

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 devrait 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.

jack
la source
votre TEMPLATE_DIRS est-il lisible par le serveur Web?
Jordan Messina
@Jordan, TEMPLATE_DIRS accessible par root suffit. C'est ce qui est configuré sur le serveur distant qui fonctionne.
jack

Réponses:

197

Première solution :

Ces paramètres

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

signifie que Django examinera les modèles du templates/répertoire sous votre projet.

En supposant que votre projet Django se trouve à, /usr/lib/python2.5/site-packages/projectname/alors avec vos paramètres, django recherchera les modèles sous/usr/lib/python2.5/site-packages/projectname/templates/

Donc, dans ce cas, nous voulons déplacer nos modèles pour qu'ils soient structurés comme ceci:

/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 les applications sont configurées dans settings.py comme ceci:

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

Par défaut, Django chargera les modèles sous le templates/répertoire sous toutes les applications installées. Donc, avec votre structure de répertoires, 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_PATHne peut pas être défini par défaut. Dans ce cas, vous voudrez le définir (dans settings.py):

import os
SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__))
Joshua Partogi
la source
3
@jpartogi, j'ai essayé les deux approches mais aucune ne fonctionne. J'ai même essayé d'utiliser le chemin absolu vers le modèle dans l'argument render_to_response () mais ne fonctionnait toujours pas.
jack
Votre projet django est-il en cours /usr/lib/python2.5/site-packages/projectname/?
Joshua Partogi
@jpartogi, oui, toutes les applications installées sont sous /usr/lib/python2.5/site-packages/projectname/appname1, ...
jack
Pouvez-vous s'il vous plaît modifier votre message d'origine et coller le settings.py. Hors DB Config: -d. Merci.
Joshua Partogi
Mettre chaque modèle de différentes applications dans un répertoire templatesn'est pas une bonne conception. Mais, comme je le sais, après avoir ajouté votre APP_NAMEdans le settings.py, vous djangopouvez rechercher le modèle de l'application sous le répertoire qui se trouve sous le APP_DIR. Ainsi, vous pouvez séparer le modèle pour diverses applications. (Django 1.7 - .1.9
Alston
59

Trouvez 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

"os.path.join(SETTINGS_PATH, 'templates')"

Donc, au total, vous avez besoin de:

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',
            ],
        },
    },
]
Bacs
la source
24
SETTINGS_PATHn'est en fait définie nulle part, donc je ne pense pas que cette réponse fonctionnera. Peut-être que vous vouliez direBASE_DIR
doucement
1
define SETTINGS_PATH = os.path.dirname (os.path.dirname ( fichier ))
Shapon Pal
1
Je pense que Shapon Pal signifie SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__)), pas de fichier
micro
20

Si vous rencontrez ce problème lorsque vous ajoutez un appfichier. C'est probablement parce que vous en manquez settings. Trois étapes sont nécessaires lors de l'ajout d'un fichier app.

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

Supposons que vous ayez un projet nommé mysiteet que vous souhaitez ajouter un appnom your_app_name. Mettez votre fichier de modèle sous mysite/your_app_name/templates/your_app_namecomme 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, ajoutez votre appà INSTALLED_APPS.

Modifier settings.py

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

3, ajoutez votre apprépertoire DIRSdans TEMPLATES.

Modifiez settings.py.

TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates'),
                 os.path.join(BASE_DIR, 'your_app_name', 'templates', 'your_app_name'),
                ...
                ]
    }
]
W.Perrin
la source
C'était la seule solution qui fonctionne pour moi en utilisant django 2.2.7
Jhonatas Kleinkauff
1
Dans mon cas, seule l'étape 2 manquait. le tableau DIRS, je pouvais le laisser vide et cela fonctionnait toujours et cherchait le modèle dans le bon répertoire de modèles de l'application.
Shri Shinde
13

Dans le paramètre .py, supprimez TEMPLATE_LOADERS et TEMPLATE DIRS, puis AJOUTER

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',
        ],
    },
 },
]
jayant singh
la source
5

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

J'ai eu cette erreur parce que je me dépêchais et que j'avais oublié de mettre l'application INSTALLED_APPS. On pourrait penser que Django soulèverait une erreur plus descriptive.

Chris Conlan
la source
4

Juste une intuition, mais consultez cet article sur le chargement des modèles Django . En particulier, assurez-vous de l'avoir django.template.loaders.app_directories.Loaderdans votre liste TEMPLATE_LOADERS.

Peter Rowell
la source
Cela a fonctionné pour moi. Charge les modèles des applications Django sur le système de fichiers. Pour chaque application dans INSTALLED_APPS, le chargeur recherche un sous-répertoire de modèles. Si le répertoire existe, Django y recherche des modèles. <br> TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates', 'APP_DIRS': True,}]
Vijay
4

Vérifiez les autorisations sur les modèles et les répertoires appname, soit avec ls -l, soit essayez de faire un chemin absolu open () depuis django.

kibitzer
la source
4

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 le faire fonctionner.

En outre, je dois exécuter la commande suivante sur la machine locale pour rendre tous les fichiers statiques accessibles mais sur le serveur distant, ils sont tous "root: root".

chown -R www-data:www-data /var/www/projectname/*

La machine locale fonctionne sur l'édition de bureau Ubuntu 8.04. Le serveur distant est sur l'édition du serveur Ubuntu 9.04.

Quelqu'un sait pourquoi?

jack
la source
4

Pour la version 1.9 de django, j'ai ajouté

'DIRS': [os.path.join(BASE_DIR, 'templates')], 

ligne vers le bloc Modèles dans settings.py Et cela a bien fonctionné

Kapilfreeman
la source
3

Django TemplateDoesNotExist erreur signifie simplement que le framework ne peut pas trouver le fichier de modèle.

Pour utiliser l'API de chargement de modèles, vous devez indiquer au framework où vous stockez vos modèles. L'endroit pour faire cela est dans votre fichier de paramètres ( settings.py) parTEMPLATE_DIRS définissant. Par défaut, c'est un tuple vide, donc ce paramètre indique au mécanisme de chargement de modèles de Django où chercher les modèles.

Choisissez un répertoire dans lequel vous souhaitez stocker vos modèles et ajoutez-le à TEMPLATE_DIRS, par exemple:

TEMPLATE_DIRS = (
  '/home/django/myproject/templates',
)
Kenorb
la source
1

Voir quel dossier django essaie de charger le modèle regarde Template-loader postmortemdans la page d'erreur, par exemple, l'erreur ne ressemblera à rien:

Template-loader postmortem

Django tried loading these templates, in this order:

Using engine django:
django.template.loaders.filesystem.Loader: d:\projects\vcsrc\vcsrc\templates\base.html (Source does not exist)

Dans mon erreur vcsrc\vcsrc\templates\base.htmlpas en chemin.
Puis changez TEMPLATESdans le setting.pyfichier le chemin de vos modèles

TEMPLATES = [
    {    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
         # 'DIRS': [], 
        'DIRS': [os.path.join(BASE_DIR, 'vcsrc/templates')], 
        ...
Nguyên
la source
1

Je dois utiliser des modèles pour une application interne et cela fonctionne pour moi:

'DIRS': [os.path.join(BASE_DIR + '/THE_APP_NAME', 'templates')],
Diego Cortes
la source
1

Assurez - vous que vous avez ajouté votre application à la project-name/app-namme/settings.py INSTALLED_APPS: .

INSTALLED_APPS = ['app-name.apps.AppNameConfig']

Et sur project-name/app-namme/settings.py TEMPLATES: .

'DIRS': [os.path.join(BASE_DIR, 'templates')],
Murdock Helscream
la source
0

Vérifiez que vos templates.html sont dans /usr/lib/python2.5/site-packages/projectname/templatesdir.

Juanjo Conti
la source
0

Salut les gars, j'ai trouvé une nouvelle solution. En fait, il est défini dans un autre modèle, donc au lieu de définir vous-même TEMPLATE_DIRS, mettez le nom de votre chemin de répertoire à leur: entrez la description de l'image ici

Amit
la source
0

Je suis gêné de l'admettre, mais le problème pour moi était qu'un modèle avait été spécifié comme ….hmlau lieu de ….html. Fais attention!

kokociel
la source
0

J'ai ajouté ceci

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

et il montrait toujours l'erreur, puis j'ai réalisé que dans un autre projet, les modèles montraient sans ajouter ce code dans le fichier settings.py alors j'ai vérifié ce projet et j'ai réalisé que je n'avais pas créé d'environnement virtuel dans ce projet, alors j'ai fait

virtualenv env 

et ça a marché, je ne sais pas pourquoi

Keval
la source
0

J'ai rencontré ce problème. Voici comment j'ai résolu ceci:

Regardez votre settings.py, localisez la TEMPLATESvariable, dans les TEMPLATES, ajoutez le chemin de vos modèles dans la DIRSliste. Pour moi, je définis d'abord le chemin de mes modèles sur TEMPLATES_PATH = os.path.join(BASE_DIR,'templates'), puis je les ajoute TEMPLATES_PATHà la DIRSliste 'DIRS':[TEMPLATES_PATH,]. Ensuite, redémarrez le serveur, l'exception TemplateDoesNotExist a disparu. C'est tout.

imcaozi
la source
0

dans votre setting.pyfichier remplacez DIRSdans le TEMPLATEStableau par ceci

'DIRS': []

pour ça

'DIRS': [os.path.join(BASE_DIR, 'templates')],

mais je pense que vous devez savoir que vous devez créer un dossier avec un nom templates et qu'il devrait sur le chemin racine sinon vous devez changer la DIRSvaleur

Krishna Kumar Jangid
la source
0

1. créez un dossier `` modèles '' dans votre `` application '' (disons que vous avez nommé une telle application) et vous pouvez placer le fichier html ici. Mais il est fortement recommandé de créer un dossier avec le même nom ('app') dans le dossier 'templates' et de ne mettre les html qu'ensuite. Dans le dossier 'app / templates / app'

2. maintenant dans les urls.py de 'app', mettez:

  path('', views.index, name='index'), # in case of  use default server index.html 

3. dans views.py de 'app', mettez:

from django.shortcuts import render 

def index(request): return
    render(request,"app/index.html")
    # name 'index' as you want
CodeToLife
la source