Django TemplateDoesNotExist?

163

Minha máquina local está executando o Python 2.5 e o Nginx no Ubuntu 8.10, com o Django construído a partir do tronco de desenvolvimento mais recente.

Para cada URL que eu solicitar, ele lança:

TemplateDoesNotExist em / appname / path appname / template_name.html

O Django tentou carregar esses modelos, nesta ordem: * Usando o carregador django.template.loaders.filesystem.function: * Usando o carregador django.template.loaders.app_directories.function:

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

Ele está procurando /usr/lib/python2.5/site-packages/projectname/templates/appname/template_name.html neste caso? O estranho é que esse arquivo existe no disco. Por que o Django não pode localizá-lo?

Eu executo o mesmo aplicativo em um servidor remoto com Python 2.6 no Ubuntu 9.04 sem esse problema. Outras configurações são as mesmas.

Existe algo mal configurado na minha máquina local ou o que poderia ter causado esses erros nos quais eu deveria procurar?

No meu settings.py , especifiquei:

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

Ele deve procurar os seguintes arquivos:

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

Todos os arquivos acima existem no disco.

Resolvido

Funciona agora depois que eu tentei:

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

É estranho. Não preciso fazer isso no servidor remoto para fazê-lo funcionar.

jack
fonte
seu TEMPLATE_DIRS é legível pelo servidor da web?
13139 Jordan Messina
@ Jordânia, TEMPLATE_DIRS acessível pela raiz é suficiente. É o que está configurado no servidor remoto que está funcionando.
jack

Respostas:

196

Primeira solução :

Essas configurações

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

significa que o Django examinará os modelos do templates/diretório em seu projeto.

Supondo que seu projeto Django esteja localizado em /usr/lib/python2.5/site-packages/projectname/seguida, com suas configurações, o django procurará os modelos em/usr/lib/python2.5/site-packages/projectname/templates/

Portanto, nesse caso, queremos mover nossos modelos para que sejam estruturados assim:

/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

Segunda solução :

Se isso ainda não funcionar e supondo que você tenha os aplicativos configurados em settings.py assim:

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

Por padrão, o Django carregará os modelos no templates/diretório em todos os aplicativos instalados. Portanto, com sua estrutura de diretórios, queremos mover nossos modelos para ficar assim:

/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_PATHpode não ser definido por padrão. Nesse caso, você desejará defini-lo (em settings.py):

import os
SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__))
Joshua Partogi
fonte
3
@ jpartogi, tentei ambas as abordagens, mas nenhuma delas funciona. Eu até tentei usar o caminho absoluto para o modelo no argumento render_to_response (), mas ainda não funcionou.
jack
O seu projeto django está em andamento /usr/lib/python2.5/site-packages/projectname/?
Joshua Partogi
@jpartogi, sim, todos os aplicativos instalados estão sob /usr/lib/python2.5/site-packages/projectname/appname1, ...
jack
Você pode editar sua postagem original e colar o settings.py. Excluindo a configuração do banco de dados: -d. Obrigado.
21009 Joshua Partogi
Colocar todos os modelos de aplicativos diferentes em um diretório templatesnão é um bom design. Mas, como eu sei, depois de adicionar o seu APP_NAMEno settings.py, djangopode procurar o modelo do aplicativo no diretório que está no diretório APP_DIR. Assim, você pode separar o modelo para vários aplicativos. (Django 1.7 - .1.9
Alston
59

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

Você precisa adicionar a 'DIRS' a string

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

Então, no total, você precisa:

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
fonte
24
SETTINGS_PATHnão está realmente definido em lugar algum, então não acho que essa resposta funcione. Talvez você quis dizerBASE_DIR
sofly
1
definir SETTINGS_PATH = os.path.dirname (os.path.dirname ( arquivo ))
Shapon Pal
1
Acho meio Shapon Pal SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__)), não arquivo
mic
20

Se você encontrar esse problema ao adicionar um appdo zero. Provavelmente é porque você sente falta de alguns settings. Três etapas são necessárias ao adicionar um app.

1 、 Crie o diretório e o arquivo de modelo.

Suponha que você tenha um projeto nomeado mysitee deseje adicionar um appnome your_app_name. Coloque seu arquivo de modelo da mysite/your_app_name/templates/your_app_nameseguinte maneira.

├── 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 、 Adicione appao seu INSTALLED_APPS.

Modificar settings.py

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

3 、 Adicione seu appdiretório ao DIRSin TEMPLATES.

Modificar settings.py.

TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates'),
                 os.path.join(BASE_DIR, 'your_app_name', 'templates', 'your_app_name'),
                ...
                ]
    }
]
W.Perrin
fonte
Esta foi a única solução que funciona para mim usando o django 2.2.7
Jhonatas Kleinkauff
1
No meu caso, apenas o passo 2 estava faltando. o array DIRS eu poderia deixar em branco e ele ainda funcionou e procurou o modelo no diretório de modelos correto do aplicativo.
Shri Shinde 30/04
13

Na configuração .py remova TEMPLATE_LOADERS e TEMPLATE DIRS e depois ADICIONE

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
fonte
5

Eu tive um problema embaraçoso ...

Recebi esse erro porque estava correndo e esqueci de colocar o aplicativo INSTALLED_APPS. Você pensaria que o Django geraria um erro mais descritivo.

Chris Conlan
fonte
4

Apenas um palpite, mas confira este artigo sobre o carregamento de modelos do Django . Em particular, verifique se você está django.template.loaders.app_directories.Loaderna sua lista TEMPLATE_LOADERS.

Peter Rowell
fonte
Isso funcionou para mim. Carrega modelos de aplicativos Django no sistema de arquivos. Para cada aplicativo em INSTALLED_APPS, o carregador procura um subdiretório de modelos. Se o diretório existir, o Django procurará modelos lá. <br> TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates', 'APP_DIRS': True,}]
Vijay
4

Verifique as permissões nos modelos e nos diretórios appname, com ls -l ou tente fazer um caminho absoluto open () no django.

kibitzer
fonte
4

Funciona agora depois que eu tentei

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

É estranho. Eu não preciso fazer isso no servidor remoto para fazê-lo funcionar.

Além disso, eu tenho que executar o seguinte comando na máquina local para tornar todos os arquivos estáticos acessíveis, mas no servidor remoto todos eles são "root: root".

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

A máquina local é executada no Ubuntu 8.04 desktop edition. O servidor remoto está no Ubuntu 9.04 server edition.

Alguém sabe por que?

jack
fonte
4

Para a versão 1.9 do django, adicionei

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

linha para o bloco Modelos em settings.py E funcionou bem

Kapilfreeman
fonte
3

TemplateDoesNotExistErro no Django significa simplesmente que o framework não consegue encontrar o arquivo de modelo.

Para usar a API de carregamento de modelos, você precisará informar a estrutura em que armazena seus modelos. O local para fazer isso está no seu arquivo de configurações ( settings.py), TEMPLATE_DIRSdefinindo. Por padrão, é uma tupla vazia, então essa configuração informa ao mecanismo de carregamento de modelos do Django onde procurar por modelos.

Escolha um diretório onde você deseja armazenar seus modelos e adicione-o a TEMPLATE_DIRS, por exemplo:

TEMPLATE_DIRS = (
  '/home/django/myproject/templates',
)
kenorb
fonte
1

Veja em qual pasta o django tenta carregar o modelo Template-loader postmortemvisualizado na página de erro, por exemplo, o erro parecerá assim:

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)

No meu erro vcsrc\vcsrc\templates\base.htmlnão no caminho.
Em seguida, mude TEMPLATESem setting.pyarquivo para o seu caminho de modelos

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

Devo usar modelos para um aplicativo interno e funciona para mim:

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

Certifique-se de que você adicionou seu aplicativo para o project-name/app-namme/settings.py INSTALLED_APPS: .

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

E no project-name/app-namme/settings.py MODELOS: .

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

Verifique se o seu templates.html está no /usr/lib/python2.5/site-packages/projectname/templatesdiretório

Juanjo Conti
fonte
0

Olá pessoal, encontrei uma nova solução. Na verdade, ele está definido em outro modelo. Portanto, em vez de definir TEMPLATE_DIRS, coloque o nome do caminho do diretório como: insira a descrição da imagem aqui

Amit
fonte
0

Tenho vergonha de admitir isso, mas o problema para mim era que um modelo havia sido especificado como em ….hmlvez de ….html. Cuidado!

kokociel
fonte
0

Eu adicionei isso

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

e ainda mostrava o erro, então percebi que em outro projeto os modelos estavam sendo exibidos sem adicionar esse código no arquivo settings.py, então verifiquei o projeto e percebi que não havia criado um ambiente virtual nesse projeto.

virtualenv env 

e funcionou, não sei porque

Keval
fonte
0

Eu vim com esse problema. Aqui está como eu resolvi isso:

Veja o seu settings.py, localize a TEMPLATESvariável, dentro de TEMPLATES, adicione o caminho dos seus modelos dentro da DIRSlista. Para mim, primeiro defino o caminho dos meus modelos como TEMPLATES_PATH = os.path.join(BASE_DIR,'templates')e depois adiciono TEMPLATES_PATHà DIRSlista 'DIRS':[TEMPLATES_PATH,],. Em seguida, reinicie o servidor, a exceção TemplateDoesNotExist se foi. É isso aí.

imcaozi
fonte
0

no seu setting.pyarquivo substitua DIRSna TEMPLATESmatriz por este

'DIRS': []

para isso

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

mas acho que você precisa saber é que você precisa criar uma pasta com o nome templates e ela deve estar no caminho raiz, caso contrário você precisará alterar o DIRSvalor

Krishna Kumar Jangid
fonte
0

1. crie uma pasta 'templates' no seu 'app' (digamos que você o nomeou como app) e você pode colocar o arquivo html aqui. Mas é altamente recomendável criar uma pasta com o mesmo nome ('app') na pasta 'templates' e só então colocar htmls lá. Na pasta 'app / templates / app'

2. agora em urls.py de 'app' coloque:

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

3. em views.py de 'app':

from django.shortcuts import render 

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