Django TemplateDoesNotExist?


163

La mia macchina locale esegue Python 2.5 e Nginx su Ubuntu 8.10, con Django costruito dall'ultimo trunk di sviluppo.

Per ogni URL che richiedo, genera:

TemplateDoesNotExist in / nome app / percorso nome app / nome_modello.html

Django ha provato a caricare questi modelli, in questo ordine: * Utilizzando loader django.template.loaders.filesystem.function: * Utilizzando loader django.template.loaders.app_directories.function:

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

Sta cercando /usr/lib/python2.5/site-packages/projectname/templates/appname/template_name.html in questo caso? La cosa strana è che questo file esiste sul disco. Perché Django non riesce a trovarlo?

Eseguo la stessa applicazione su un server remoto con Python 2.6 su Ubuntu 9.04 senza tale problema. Altre impostazioni sono uguali.

C'è qualcosa di errato configurato sul mio computer locale o cosa potrebbe aver causato tali errori che dovrei esaminare?

Nel mio settings.py , ho specificato:

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'),
)

Dovrebbe cercare i seguenti file:

  • /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
  • ...

Tutti i file di cui sopra esistono sul disco.

risolto

Funziona ora dopo che ho provato:

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

È strano. Non ho bisogno di farlo sul server remoto per farlo funzionare.


il tuo TEMPLATE_DIRS è leggibile dal server web?
Giordania Messina,

@Jordan, TEMPLATE_DIRS accessibile da root è sufficiente. È quello che è configurato sul server remoto che funziona.
Jack,

Risposte:


197

Prima soluzione :

Queste impostazioni

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

significa che Django guarderà i template dalla templates/directory sotto il tuo progetto.

Supponendo che il tuo progetto Django si trovi in /usr/lib/python2.5/site-packages/projectname/quel momento con le tue impostazioni django cercherà i modelli sotto/usr/lib/python2.5/site-packages/projectname/templates/

Quindi in quel caso vogliamo spostare i nostri modelli per essere strutturati in questo modo:

/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

Seconda soluzione :

Se ancora non funziona e supponendo che tu abbia le app configurate in settings.py in questo modo:

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

Per impostazione predefinita, Django caricherà i modelli nella templates/directory in tutte le app installate. Quindi, con la tua struttura di directory, vogliamo spostare i nostri modelli in questo modo:

/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_PATHpotrebbe non essere definito per impostazione predefinita. In tal caso, dovrai definirlo (in settings.py):

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

3
@jpartogi, ho provato entrambi gli approcci ma nessuno dei due funziona. Ho anche provato a usare il percorso assoluto del modello nell'argomento render_to_response () ma ancora non ha funzionato.
Jack,

Il tuo progetto Django è sotto /usr/lib/python2.5/site-packages/projectname/?
Joshua Partogi,

@jpartogi, sì, tutte le app installate sono sotto /usr/lib/python2.5/site-packages/projectname/appname1, ...
jack

Puoi modificare il tuo post originale e incollare settings.py. Escludendo Config DB: -d. Grazie.
Joshua Partogi,

Mettere tutti i modelli di app diverse in una directory templatesnon è un buon design. Ma, come so, dopo aver aggiunto il tuo APP_NAMEin settings.py, djangopotrebbe andare a cercare il modello dell'app nella directory che si trova sotto il APP_DIR. Pertanto, puoi separare il modello per varie app. (Django 1.7 - .1.9
Alston,

59

Trova questa tupla:

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

Devi aggiungere a 'DIRS' la stringa

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

Quindi nel complesso hai bisogno di:

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

24
SETTINGS_PATHin realtà non è definito da nessuna parte, quindi non credo che questa risposta funzionerà. Forse volevi direBASE_DIR
leggermente il

1
define SETTINGS_PATH = os.path.dirname (os.path.dirname ( file ))
Shapon Pal

1
Penso che Shapon Pal significhi SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__)), non file
mic

20

Se riscontri questo problema quando lo aggiungi appda zero. Probabilmente è perché ti manca un po ' settings. Sono necessari tre passaggi quando si aggiunge un app.

1 、 Creare la directory e il file modello.

Supponiamo di avere un progetto chiamato mysitee di voler aggiungere un appnome your_app_name. Metti il ​​tuo file modello sotto mysite/your_app_name/templates/your_app_namecome segue.

├── 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 、 Aggiungi il tuo appa INSTALLED_APPS.

Modificare settings.py

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

3 、 Aggiungi la tua appdirectory a DIRSin TEMPLATES.

Modifica settings.py.

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

Questa è stata l'unica soluzione che funziona per me usando Django 2.2.7
Jhonatas Kleinkauff

1
Nel mio caso mancava solo il passaggio 2. l'array DIRS ho potuto lasciarlo vuoto e funzionava ancora e cercava il modello nella giusta directory dei modelli dell'app.
Shri Shinde,

13

Nell'impostazione di .py rimuovere TEMPLATE_LOADERS e TEMPLATE DIRS, quindi 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',
        ],
    },
 },
]

5

Ho avuto un problema imbarazzante ...

Ho ricevuto questo errore perché mi stavo affrettando e ho dimenticato di inserire l'app INSTALLED_APPS. Penseresti che Django genererebbe un errore più descrittivo.


4

Solo un sospetto, ma dai un'occhiata a questo articolo sul caricamento del modello di Django . In particolare, assicurati di avere django.template.loaders.app_directories.Loadernell'elenco TEMPLATE_LOADERS.


Questo ha funzionato per me. Carica modelli dalle app di Django sul filesystem. Per ogni app in INSTALLED_APPS, il caricatore cerca una sottodirectory dei modelli. Se la directory esiste, Django cerca i template lì dentro. <br> TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates', 'APP_DIRS': True,}]
Vijay,

4

Controlla le autorizzazioni per i template e le directory dei nomi di app, con ls -l o prova a fare un percorso assoluto open () da django.


4

Funziona ora dopo che ho provato

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

È strano. Non è necessario farlo sul server remoto per farlo funzionare.

Inoltre, devo eseguire il comando seguente sulla macchina locale per rendere accessibili tutti i file statici ma sul server remoto sono tutti "root: root".

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

La macchina locale funziona su Ubuntu 8.04 desktop edition. Il server remoto è su Ubuntu 9.04 edizione server.

Qualcuno sa perché?


4

Per la versione 1.9 di Django, ho aggiunto

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

linea al blocco Modelli in settings.py E ha funzionato bene


3

TemplateDoesNotExistErrore di Django significa semplicemente che il framework non riesce a trovare il file modello.

Per utilizzare l'API per il caricamento dei modelli, devi indicare al framework in cui memorizzi i tuoi modelli. Il posto dove farlo è nel file delle impostazioni ( settings.py) TEMPLATE_DIRSimpostando. Di default è una tupla vuota, quindi questa impostazione indica al meccanismo di caricamento dei template di Django dove cercare i template.

Scegli una directory in cui desideri memorizzare i tuoi modelli e aggiungila a TEMPLATE_DIRS, ad esempio:

TEMPLATE_DIRS = (
  '/home/django/myproject/templates',
)

1

Vedi quale cartella django prova a caricare il modello guarda Template-loader postmortemnella pagina di errore, ad esempio, l'errore si comporterà in questo modo:

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)

Nel mio errore vcsrc\vcsrc\templates\base.htmlnon nel percorso.
Quindi modifica TEMPLATESnel setting.pyfile il percorso dei tuoi modelli

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

1

Devo usare i modelli per un'APP interna e funziona per me:

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

1

Assicurati di aver inserito la vostra applicazione al project-name/app-namme/settings.py INSTALLED_APPS: .

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

E su project-name/app-namme/settings.py MODELLI: .

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

0

Verifica che i tuoi template.html siano in /usr/lib/python2.5/site-packages/projectname/templatesdir.


0

Ciao ragazzi ho trovato una nuova soluzione. In realtà è definito in un altro modello, quindi invece di definire TEMPLATE_DIRS tu stesso, metti il ​​nome del tuo percorso di directory al loro: inserisci qui la descrizione dell'immagine


0

Sono imbarazzato di ammetterlo, ma il problema per me era che era stato specificato un modello al ….hmlposto di ….html. Attento!


0

Ho aggiunto questo

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

e mostrava ancora l'errore, poi mi sono reso conto che in un altro progetto i modelli stavano mostrando senza aggiungere quel codice nel file settings.py, quindi ho controllato quel progetto e mi sono reso conto che non ho creato un ambiente virtuale in questo progetto, così ho fatto

virtualenv env 

e ha funzionato, non so perché


0

Mi è venuto in mente questo problema. Ecco come ho risolto questo:

Guarda settings.py, individua la TEMPLATESvariabile, all'interno dei MODELLI, aggiungi il percorso dei tuoi modelli all'interno DIRSdell'elenco. Per me, prima ho impostato il percorso dei miei modelli come TEMPLATES_PATH = os.path.join(BASE_DIR,'templates'), quindi aggiungo TEMPLATES_PATHalla DIRSlista 'DIRS':[TEMPLATES_PATH,],. Quindi riavviare il server, l'eccezione TemplateDoesNotExist è sparita. Questo è tutto.


0

nel tuo setting.pyfile sostituisci DIRSin TEMPLATESarray con questo

'DIRS': []

a questa

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

ma 1 penso che tu debba sapere è che devi creare una cartella con nome templates e dovrebbe essere sul percorso di root, altrimenti devi cambiare il DIRSvalore


0

1.crea una cartella "modelli" nella tua "app" (supponiamo che tu abbia chiamato tale app) e puoi inserire qui il file html. Si consiglia vivamente di creare una cartella con lo stesso nome ('app') nella cartella 'modelli' e solo successivamente inserire htmls. Nella cartella "app / modelli / app"

2.now in 'app' 's urls.py mettere:

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

3. in 'app' 's views.py mettere:

from django.shortcuts import render 

def index(request): return
    render(request,"app/index.html")
    # name 'index' as you want
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.