我的本地机器在 Ubuntu 8.10 上运行 Python 2.5 和 Nginx,Django 是从最新的开发主干构建的。
对于我请求的每个 URL,它都会抛出:
TemplateDoesNotExist at /appname/path appname/template_name.html Django 尝试按以下顺序加载这些模板: * Using loader django.template.loaders.filesystem.function: * Using 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/*
真奇怪。我不需要在远程服务器上执行此操作即可使其正常工作。
第一个解决方案:
这些设置
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__))
找到这个元组:
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',
],
},
},
]
SETTINGS_PATH
实际上并没有在任何地方定义,所以我认为这个答案不会奏效。也许您的意思是BASE_DIR
SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__))
,而不是 file
如果您在从头开始添加 app
时遇到此问题。可能是因为您错过了一些settings
。添加 app
时需要三个步骤。
1、创建目录和模板文件。
假设您有一个名为 mysite
的项目,并且您想要添加一个名为 your_app_name
的 app
。将您的模板文件放在 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
2、将您的应用添加到 INSTALLED_APPS。
修改settings.py
INSTALLED_APPS = [
...
'your_app_name',
...
]
3、将你的应用目录添加到TEMPLATES中的DIRS中。
修改 settings.py
。
TEMPLATES = [
{
...
'DIRS': [os.path.join(BASE_DIR, 'templates'),
os.path.join(BASE_DIR, 'your_app_name', 'templates', 'your_app_name'),
...
]
}
]
INSTALLED_APPS
中丢失,谢谢!
在设置 .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',
],
},
},
]
我遇到了一个尴尬的问题...
我收到此错误是因为我赶时间并忘记将应用程序放入 INSTALLED_APPS
。你会认为 Django 会引发一个更具描述性的错误。
从在版本 3
上测试的 Django 版本开始,您需要将新应用添加到已安装的应用中。 django 应用程序不需要其他代码更改
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'addyourappnamehere'
]
对于 django 1.9 版,我添加了
'DIRS': [os.path.join(BASE_DIR, 'templates')],
到 settings.py 中的 Templates 块行并且效果很好
Django TemplateDoesNotExist
错误意味着框架找不到模板文件。
要使用模板加载 API,您需要告诉框架您将模板存储在哪里。执行此操作的位置在您的设置文件 (settings.py
) 中的 TEMPLATE_DIRS
设置。默认情况下它是一个空元组,所以这个设置告诉 Django 的模板加载机制在哪里寻找模板。
选择一个您想要存储模板的目录并将其添加到 TEMPLATE_DIRS 例如:
TEMPLATE_DIRS = (
'/home/django/myproject/templates',
)
只是预感,但请查看 this article on Django template loading。特别是,请确保您的 TEMPLATE_LOADERS 列表中有 django.template.loaders.app_directories.Loader
。
检查模板和 appname 目录的权限,使用 ls -l 或尝试从 django 执行绝对路径 open()。
我尝试后现在可以使用
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 服务器版本上。
有人知道为什么吗?
确保您已将您的应用添加到 project-name/app-namme/settings.py
INSTALLED_APPS: 中。
INSTALLED_APPS = ['app-name.apps.AppNameConfig']
在 project-name/app-namme/settings.py
TEMPLATES: 上。
'DIRS': [os.path.join(BASE_DIR, 'templates')],
我必须为内部 APP 使用模板,它对我有用:
'DIRS': [os.path.join(BASE_DIR + '/THE_APP_NAME', 'templates')],
查看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
不在路径中。
然后将 setting.py
文件中的 TEMPLATES
更改为您的模板路径
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 'DIRS': [],
'DIRS': [os.path.join(BASE_DIR, 'vcsrc/templates')],
...
在您的 setting.py
文件中,将 TEMPLATES
数组中的 DIRS
替换为此
'DIRS': []
对此
'DIRS': [os.path.join(BASE_DIR, 'templates')],
但是 1 认为你需要知道的是你必须创建一个名为 templates
的文件夹,它应该在根路径上,否则你必须更改 DIRS
价值
如果 django rest 框架,将 rest_framework
添加到 INSTALLED_APPS。就我而言,我错过了将其添加到已安装的应用程序中。
INSTALLED_APPS = [
'..........',,
'rest_framework',
'.........',
]
在我的情况下,只需将我的应用程序包含在 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")
2022 年 5 月更新:
只要您正确地遵循this tutorial(convention),您就不需要在“settings.py”中更改和触摸“TEMPLATES”的默认设置,如下图所示:
# "core/settings.py"
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",
],
},
},
]
同样,只要您正确遵循 this tutorial(convention),无论 “templates”文件夹 是否在 应用程序文件夹“templates” > 如下图:
root
├── core
│ ├── settings.py
│ ├── urls.py
│ ...
├── myapp1
│ ├── templates
│ │ └── myapp1
│ │ └── myapp1.html
│ ├── urls.py
│ ├── views.py
│ ...
├── myapp2
│ ├── templates
│ │ └── myapp2
│ │ └── myapp2.html
│ ├── urls.py
│ ├── views.py
│ ...
并且,“模板”文件夹是否位于根 django 项目文件夹下,如下所示:
root
├── core
│ ├── settings.py
│ ├── urls.py
│ ...
├── myapp1
│ ├── urls.py
│ ├── views.py
│ ...
├── myapp2
│ ├── urls.py
│ ├── views.py
│ ...
├── templates
│ ├── myapp1
| | └── myapp1.html
| └── myapp2
| └── myapp2.html
因此,您需要做的关键事情就是不要更改并触摸“settings.py”中“TEMPLATES”的默认设置,如下所示:
# "core/settings.py"
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",
],
},
},
]
然后,在“core/settings.py”中将“myapp1”和“myapp2”应用程序设置为“INSTALLED_APPS”,如下所示:
# "core/settings.py"
INSTALLED_APPS = [
...
"myapp1",
"myapp2",
]
然后,编写“myapp1”和“myapp2”应用程序的每个“views.py”,如下所示。请注意,您需要编写每个“模板”路径“myapp1/myapp1.html”和“myapp2/myapp2.html”,而不是仅在“渲染”中编写每个“模板”路径“myapp1.html”和“myapp2.html” ()“ 如下所示:
# "myapp1/views.py"
from django.shortcuts import render
def myapp1(request): # Don't write just "myapp1.html"
return render(request, "myapp1/myapp1.html")
# "myapp2/views.py"
from django.shortcuts import render
def myapp2(request): # Don't write just "myapp2.html"
return render(request, "myapp2/myapp2.html")
然后,设置“myapp1”和“myapp2”应用程序的每个“views.py”路径,如下所示:
# "myapp1/views.py"
from django.urls import include, path
from . import views
urlpatterns = [
path("", views.myapp1, name='myapp1'), # Here
]
# "myapp2/views.py"
from django.urls import include, path
from . import views
urlpatterns = [
path("", views.myapp2, name='myapp2'), # Here
]
然后,在“core/urls.py”中将“myapp1”和“myapp2”应用程序的每个路径设置为“urls.py”,如下所示。最后,“myapp1”和“myapp2”应用程序的模板将被读取,没有任何错误:
# "core/urls.py"
from django.urls import include, path
urlpatterns = [
...
path("myapp1/", include('myapp1.urls')), # Here
path("myapp2/", include('myapp2.urls')), # Here
]
检查您的 templates.html 是否在 /usr/lib/python2.5/site-packages/projectname/templates
目录中。
https://i.stack.imgur.com/i1fu5.png
我很尴尬地承认这一点,但对我来说问题是模板被指定为 ….hml
而不是 ….html
。小心!
我添加了这个
TEMPLATE_DIRS = (
os.path.join(SETTINGS_PATH, 'templates'),
)
它仍然显示错误,然后我意识到在另一个项目中显示模板而没有在 settings.py 文件中添加该代码所以我检查了那个项目,我意识到我没有在这个项目中创建虚拟环境所以我做了
virtualenv env
并且成功了,不知道为什么
我想出了这个问题。这是我解决这个问题的方法:
查看您的 settings.py,找到 TEMPLATES
变量,在 TEMPLATES 中,将您的模板路径添加到 DIRS
列表中。对我来说,首先我将模板路径设置为 TEMPLATES_PATH = os.path.join(BASE_DIR,'templates')
,然后将 TEMPLATES_PATH
添加到 DIRS
列表中,'DIRS':[TEMPLATES_PATH,]
。然后重启服务器,TemplateDoesNotExist异常消失了。而已。
1.在您的“应用程序”中创建一个文件夹“模板”(假设您为您的应用程序命名),您可以将html文件放在这里。但强烈建议在 'templates' 文件夹中创建一个具有相同名称('app')的文件夹,然后才将 htmls 放在那里。进入“应用程序/模板/应用程序”文件夹
2.现在在 '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
适用于 Django 3
我发现我相信好方法,我在根文件夹中有 base.html,在 App 文件夹中有所有其他 html 文件,我在 settings.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
简单的解决方案
'DIRS':[BASE_DIR,'模板'],
我的问题是我更改了我的应用程序的名称。毫不奇怪,Visual Studio 没有更改包含模板的目录名称。手动更正解决了问题。
“模板不存在”错误的另一个原因似乎是忘记在 settings.py 中添加应用名称。我忘了添加它,这就是我的案例中出现错误的原因。
INSTALLED_APPS = [
'my_app',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
在模板中:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [r'C:\Users\islam\Desktop\html_project\django\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',
],
},
},
]
把你的模板文件的完整目录,然后在视图中:
def home(request):
return render(request, "home\index.html")
开始模板之后到 html 文件的路径
简单来说 :
完整路径是:C:\Users\islam\Desktop\html_project\django\templates\home\index.html
C:\Users\islam\Desktop\html_project\django\templates 模板文件的完整路径将在 'DIRS' 中的 TEMPLATES 中:['']
home\index.html 模板后面的路径将在 render()
您应该在 settings.py
文件中将 'templates'
键入到 TEMPLATES 的 DIRS。
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',
],
},
},
]
不定期副业成功案例分享
/usr/lib/python2.5/site-packages/projectname/
下吗?