我的本地机器在Ubuntu 8.10上运行Python 2.5和Nginx,Django是从最新的开发主干构建的。
对于我请求的每个网址,它会抛出:
/ appname / path appname / template_name.html
上的TemplateDoesNotExistDjango尝试按以下顺序加载这些模板: *使用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'),
)
它应该寻找以下文件:
以上所有文件都存在于磁盘上。
解决
我尝试后现在可以使用了:
chown -R www-data:www-data /usr/lib/python2.5/site-packages/projectname/*
很奇怪。我不需要在远程服务器上执行此操作以使其正常工作。
答案 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
时需要三个步骤。
假设您有一个名为mysite
的项目,并且想添加一个名为app
的{{1}}。如下将模板文件放在your_app_name
下。
mysite/your_app_name/templates/your_app_name
├── 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
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)
答案 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',
],
},
},
]