Django TemplateDoesNotExist?

时间:2009-12-18 03:12:11

标签: django

我的本​​地机器在Ubuntu 8.10上运行Python 2.5和Nginx,Django是从最新的开发主干构建的。

对于我请求的每个网址,它会抛出:

  

/ appname / path appname / template_name.html

上的TemplateDoesNotExist      

Django尝试按以下顺序加载这些模板:   *使用loader django.template.loaders.filesystem.function:   *使用loader django.template.loaders.app_directories.function:

     

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

在这种情况下是否正在寻找 /usr/lib/python2.5/site-packages/projectname/templates/appname/template_name.html ?奇怪的是这个文件确实存在于磁盘上。为什么Django找不到它?

我在Ubuntu 9.04上使用Python 2.6在远程服务器上运行相同的应用程序,没有这样的问题。其他设置是相同的。

我的本​​地计算机上是否有任何配置错误,或者可能导致此类错误的内容,我应该查看?

在我的 settings.py 中,我指定了:

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

它应该寻找以下文件:

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

以上所有文件都存在于磁盘上。

解决

我尝试后现在可以使用了:

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

很奇怪。我不需要在远程服务器上执行此操作以使其正常工作。

27 个答案:

答案 0 :(得分:153)

第一个解决方案

这些设置

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

表示Django将查看项目下templates/目录中的模板。

假设您的Django项目位于/usr/lib/python2.5/site-packages/projectname/,那么使用您的设置,django将在/usr/lib/python2.5/site-packages/projectname/templates/

下查找模板

因此,在这种情况下,我们希望将模板的结构设置为:

/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

第二个解决方案

如果仍然无效,并假设您在settings.py中配置了这样的应用:

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

默认情况下,Django会在每个已安装的应用下的templates/目录下加载模板。因此,对于您的目录结构,我们希望将模板移动为:

/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。在这种情况下,您需要定义它(在settings.py中):

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

答案 1 :(得分:38)

找到这个元组:

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

您需要将'DIRS'添加到字符串

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

所以你需要:

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

答案 2 :(得分:10)

在设置.py 删除 TEMPLATE_LOADERS和TEMPLATE DIRS然后添加

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

答案 3 :(得分:4)

只是预感,但请查看this article on Django template loading。特别是,请确保您的TEMPLATE_LOADERS列表中包含django.template.loaders.app_directories.Loader

答案 4 :(得分:4)

检查模板和appname目录的权限,使用ls -l或尝试从django执行绝对路径open()。

答案 5 :(得分:4)

我尝试

后现在可以使用了
chown -R www-data:www-data /usr/lib/python2.5/site-packages/projectname/*

很奇怪。我不需要在远程服务器上执行此操作以使其正常工作。

此外,我必须在本地计算机上运行以下命令以使所有静态文件都可访问,但在远程服务器上它们都是“root:root”。

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

本地计算机在Ubuntu 8.04桌面版上运行。远程服务器在Ubuntu 9.04服务器版本上。

有谁知道为什么?

答案 6 :(得分:4)

如果从头开始添加app时遇到此问题。可能是因为您错过了一些settings。添加app时需要三个步骤。

1,创建目录和模板文件。

假设您有一个名为mysite的项目,并且想添加一个名为app的{​​{1}}。如下将模板文件放在your_app_name下。

mysite/your_app_name/templates/your_app_name

2,将您的├── 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 添加到app

修改INSTALLED_APPS

settings.py

3,将您的INSTALLED_APPS = [ ... 'your_app_name', ... ] 目录添加到app中的DIRS

修改TEMPLATES

settings.py

答案 7 :(得分:3)

Django TemplateDoesNotExist错误意味着框架无法找到模板文件。

要使用模板加载API,您需要告诉框架存储模板的位置。执行此操作的位置位于settings.py设置的设置文件(TEMPLATE_DIRS)中。默认情况下它是一个空元组,所以这个设置告诉Django的模板加载机制在哪里寻找模板。

选择您要存储模板的目录,并将其添加到TEMPLATE_DIRS中,例如:

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

答案 8 :(得分:3)

对于django 1.9版,我添加了

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

到settings.py中的Templates块 它运作良好

答案 9 :(得分:2)

确保已将您的应用添加到project-name/app-namme/settings.py INSTALLED_APPS:

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

然后在project-name/app-namme/settings.py模板:

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

答案 10 :(得分:2)

我遇到了一个令人尴尬的问题...

我收到此错误是因为我急于忘记将应用程序放在INSTALLED_APPS中。您会认为Django会引发更具描述性的错误。

答案 11 :(得分:1)

从在版本 3 上测试的 Django 版本开始,您需要将新应用添加到已安装的应用中。 django 应用程序不需要其他代码更改

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'addyourappnamehere'
]

答案 12 :(得分:1)

rest_framework 添加到 INSTALLED_APPS 如果是 django rest 框架。就我而言,我没有将其添加到已安装的应用程序中。

INSTALLED_APPS = [
    '..........',,
    'rest_framework',
    '.........',
]

答案 13 :(得分:0)

我很尴尬地承认这一点,但是对我来说,问题是模板被指定为….hml而不是….html。小心!

答案 14 :(得分:0)

我必须使用内部APP的模板,它适用于我:

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

答案 15 :(得分:0)

我添加了这个

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

并且仍然显示错误,然后我意识到在另一个项目中显示模板时未在settings.py文件中添加该代码,因此我检查了该项目,并且意识到我没有在该项目中创建虚拟环境所以我做了

virtualenv env 

它奏效了,不知道为什么

答案 16 :(得分:0)

我想到了这个问题。这是我解决此问题的方法:

查看您的settings.py,找到TEMPLATES变量, 在TEMPLATES中,将模板路径添加到DIRS列表中。对于我来说,首先将模板路径设置为TEMPLATES_PATH = os.path.join(BASE_DIR,'templates'),然后将TEMPLATES_PATH添加到DIRS列表'DIRS':[TEMPLATES_PATH,]中。 然后重新启动服务器,TemplateDoesNotExist异常消失了。 就是这样。

答案 17 :(得分:0)

setting.py 文件中的

与此 DIRS 数组中的 TEMPLATES >

'DIRS': []

对此

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

但是我想你需要知道的是 您必须创建一个名为 templates 的文件夹,并且该文件夹应位于根路径上,否则您必须更改 DIRS

答案 18 :(得分:0)

1。在“应用”中创建一个文件夹“模板”(假设您为此类应用命名) 您可以将html文件放在此处。 但是强烈建议在“模板”文件夹中创建一个具有相同名称(“ app”)的文件夹,然后再将html放在该文件夹中。进入“ app / templates / app”文件夹

2.now现在位于“ app”的urls.py中:

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

3。在'app'的views.py中放置:

from django.shortcuts import render 

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

答案 19 :(得分:0)

大家好我找到了一个新的解决方案。实际上它是在另一个模板中定义的,所以不要自己定义TEMPLATE_DIRS,而是将目录路径名放在: enter image description here

答案 20 :(得分:0)

适用于 Django 3

我发现我相信好方法,我在根文件夹中有 base.html,在 App 文件夹中有所有其他 html 文件,我 设置.py

import os

# This settings are to allow store templates,static and media files in root folder

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATE_DIR = os.path.join(BASE_DIR,'templates')
STATIC_DIR = os.path.join(BASE_DIR,'static')
MEDIA_DIR = os.path.join(BASE_DIR,'media')

# This is default path from Django, must be added 
#AFTER our BASE_DIR otherwise DB will be broken.
BASE_DIR = Path(__file__).resolve().parent.parent

# add your apps to Installed apps
INSTALLED_APPS = [
    'main',
    'weblogin',
     ..........
]

# Now add TEMPLATE_DIR to  'DIRS' where in TEMPLATES like bellow
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [TEMPLATE_DIR, BASE_DIR,],
        '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',
            ],
        },
    },
]
# On end of Settings.py put this refferences to Static and Media files
STATICFILES_DIRS = [STATIC_DIR,]
STATIC_URL = '/static/'

MEDIA_ROOT = [MEDIA_DIR,]
MEDIA_URL = '/media/'

如果你的数据库有问题,请检查你是否把原来的BASE_DIR放在了新的BASE_DIR下面,否则改变

# Original
'NAME': BASE_DIR / 'db.sqlite3',
# to
'NAME': os.path.join(BASE_DIR,'db.sqlite3'),

Django 现在可以在 App 文件夹和 Root 文件夹中找到 HTML 和 Static 文件,而无需在文件前添加 App 文件夹的名称。

Struture:
-DjangoProject
    -static(css,JS ...)
    -templates(base.html, ....)
    -other django files like (manage.py, ....)
    -App1
        -templates(index1.html, other html files can extend now base.html too)
        -other App1 files
    -App2
        -templates(index2.html, other html files can extend now base.html too)
        -other App2 files

答案 21 :(得分:0)

在错误页面中查看django尝试加载模板看Template-loader postmortem的文件夹,例如,错误会像这样:

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)

我的错误vcsrc\vcsrc\templates\base.html不在路径中 然后将TEMPLATES文件中的setting.py更改为模板路径

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

答案 22 :(得分:0)

“模板不存在”错误的另一个原因似乎是忘记在 settings.py 中添加应用程序名称。我忘了添加它,这就是我的案例出现错误的原因。

INSTALLED_APPS = [ 'my_app', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]

答案 23 :(得分:0)

简单的解决方案

'DIRS': [BASE_DIR, '模板'],

答案 24 :(得分:0)

就我而言,只需在 settings.py 文件的 INSTALLED_APPS 中包含我的应用程序就足够了:

INSTALLED_APPS = [
    "myapp",
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
]

另外,请记住模板应该像这样放在你的目录中: myapp/templates/myapp/template_name.html 但是当你指向这个模板时,你会这样做: template = loader.get_template("myapp/template_name.html")

答案 25 :(得分:0)

检查您的templates.html是否在/usr/lib/python2.5/site-packages/projectname/templates目录。

答案 26 :(得分:-1)

您应该在 'templates' 文件中将 settings.py 输入到 TEMPLATES 目录中。

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