我的本地机器在Ubuntu 8.10上运行Python 2.5和Nginx,Django是从最新的开发中继构建的.
对于我请求的每个URL,它会抛出:
TemplateDoesNotExist位于/ appname/path appname/template_name.html
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'),
)
Run Code Online (Sandbox Code Playgroud)
它应该寻找以下文件:
以上所有文件都存在于磁盘上.
解决了
它在我尝试后现在有效:
chown -R www-data:www-data /usr/lib/python2.5/site-packages/projectname/*
Run Code Online (Sandbox Code Playgroud)
真奇怪.我不需要在远程服务器上执行此操作以使其工作.
Jos*_*ogi 168
第一个解决方案:
这些设置
TEMPLATE_DIRS = (
os.path.join(SETTINGS_PATH, 'templates'),
)
Run Code Online (Sandbox Code Playgroud)
意味着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
Run Code Online (Sandbox Code Playgroud)
二解决方案:
如果仍然无效,并假设您在settings.py中配置了这样的应用:
INSTALLED_APPS = (
'appname1',
'appname2',
'appname3',
)
Run Code Online (Sandbox Code Playgroud)
默认情况下,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
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.
SETTINGS_PATH默认情况下可能未定义.在这种情况下,您需要定义它(在settings.py中):
import os
SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__))
Run Code Online (Sandbox Code Playgroud)
小智 44
找到这个元组:
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',
],
},
},
]
Run Code Online (Sandbox Code Playgroud)
您需要将'DIRS'添加到字符串中
"os.path.join(SETTINGS_PATH, 'templates')"
Run Code Online (Sandbox Code Playgroud)
所以你需要:
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',
],
},
},
]
Run Code Online (Sandbox Code Playgroud)
jay*_*ngh 13
在设置.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',
],
},
},
]
Run Code Online (Sandbox Code Playgroud)
小智 10
templates文件夹可以放在django-project文件夹下或每个app文件夹下,如下所示:
django-project\n |-core\n \xe2\x94\x82\xc2\xa0 |-settings.py\n \xe2\x94\x82\xc2\xa0 \xe2\x94\x94-urls.py\n |-app1\n | |-urls.py\n | \xe2\x94\x94-views.py\n |-app2\n | |-urls.py\n | \xe2\x94\x94-views.py\n \xe2\x94\x94-templates # Here\n |-app1\n | \xe2\x94\x94-a1.html\n \xe2\x94\x94-app2\n \xe2\x94\x94-a2.html\nRun Code Online (Sandbox Code Playgroud)\n或者:
\ndjango-project\n |-core\n \xe2\x94\x82\xc2\xa0 |-settings.py\n \xe2\x94\x82\xc2\xa0 \xe2\x94\x94-urls.py\n |-app1\n | |-urls.py\n | |-views.py\n | \xe2\x94\x94-templates # Here\n | \xe2\x94\x94-app1\n | \xe2\x94\x94-a1.html\n \xe2\x94\x94-app2\n |-urls.py\n |-views.py\n \xe2\x94\x94-templates # Here\n \xe2\x94\x94-app2\n \xe2\x94\x94-a2.html\nRun Code Online (Sandbox Code Playgroud)\n例如,首先,您需要设置"app1"INSTALLED_APPS ,"app2"如下所示:settings.py
# "core/settings.py"\n\nINSTALLED_APPS = [\n ...\n "app1",\n "app2",\n]\nRun Code Online (Sandbox Code Playgroud)\n那么如果templates文件夹就在django-project文件夹下,如下所示:
django-project\n |-core\n \xe2\x94\x82\xc2\xa0 |-settings.py\n \xe2\x94\x82\xc2\xa0 \xe2\x94\x94-urls.py\n |-app1\n | |-urls.py\n | \xe2\x94\x94-views.py\n |-app2\n | |-urls.py\n | \xe2\x94\x94-views.py\n \xe2\x94\x94-templates # Here\n |-app1\n | \xe2\x94\x94-a1.html\n \xe2\x94\x94-app2\n \xe2\x94\x94-a2.html\nRun Code Online (Sandbox Code Playgroud)\n然后,您需要在TEMPLATES中设置BASE_DIR / \'templates\'为“DIRS”,如下所示。*我建议将文件夹放在文件夹下,如上所示,因为您可以在一个地方轻松管理模板:settings.pytemplatesdjango-project
# "core/settings.py"\n\nTEMPLATES = [\n {\n "BACKEND": "django.template.backends.django.DjangoTemplates",\n "DIRS": [\n BASE_DIR / \'templates\' # Here\n ],\n "APP_DIRS": True,\n "OPTIONS": {\n "context_processors": [\n "django.template.context_processors.debug",\n "django.template.context_processors.request",\n "django.contrib.auth.context_processors.auth",\n "django.contrib.messages.context_processors.messages",\n ],\n },\n },\n]\nRun Code Online (Sandbox Code Playgroud)\n并且,如果templates文件夹位于每个app文件夹下,如下所示:
django-project\n |-core\n \xe2\x94\x82\xc2\xa0 |-settings.py\n \xe2\x94\x82\xc2\xa0 \xe2\x94\x94-urls.py\n |-app1\n | |-urls.py\n | |-views.py\n | \xe2\x94\x94-templates # Here\n | \xe2\x94\x94-app1\n | \xe2\x94\x94-a1.html\n \xe2\x94\x94-app2\n |-urls.py\n |-views.py\n \xe2\x94\x94-templates # Here\n \xe2\x94\x94-app2\n \xe2\x94\x94-a2.html\nRun Code Online (Sandbox Code Playgroud)\n然后,您需要保留"DIRS"为空(默认),而不设置BASE_DIR / \'templates\'为"DIRS"in TEMPLATES,settings.py如下所示:
# "core/settings.py"\n\nTEMPLATES = [\n {\n "BACKEND": "django.template.backends.django.DjangoTemplates",\n "DIRS": [], # Keep it empty\n "APP_DIRS": True,\n "OPTIONS": {\n "context_processors": [\n "django.template.context_processors.debug",\n "django.template.context_processors.request",\n "django.contrib.auth.context_processors.auth",\n "django.contrib.messages.context_processors.messages",\n ],\n },\n },\n]\nRun Code Online (Sandbox Code Playgroud)\n然后,test()在app1/views.py和 中定义app2/views.py,如下所示。请注意,您需要设置"app1/a1.html"and"app2/a2.html"而不是仅在render()"a1.html"中设置and ,如下所示:"a2.html"
# "app1/views.py"\n\nfrom django.shortcuts import render\n\ndef test(request): # Don\'t set just "a1.html"\n return render(request, "app1/a1.html")\nRun Code Online (Sandbox Code Playgroud)\n# "app2/views.py"\n\nfrom django.shortcuts import render\n\ndef test(request): # Don\'t set just "a2.html"\n return render(request, "app2/a2.html")\nRun Code Online (Sandbox Code Playgroud)\n然后,设置和中test的各个视图,如下所示:app1app2app1/urls.pyapp2/urls.py
# "app1/urls.py"\n\nfrom django.urls import include, path\n\nfrom . import views\n\napp_name = "app1"\n\nurlpatterns = [\n path("", views.test, name=\'test\'), # Here\n]\nRun Code Online (Sandbox Code Playgroud)\n# "app2/urls.py"\n\nfrom django.urls import include, path\n\nfrom . import views\n\napp_name = "app2"\n\nurlpatterns = [\n path("", views.test, name=\'test\'), # Here\n]\nRun Code Online (Sandbox Code Playgroud)\n然后,如下所示设置和中的每urls.py一个,然后和的模板将被渲染而不会出现任何错误:app1app2core/urls.pyapp1app2
# "core/urls.py"\n\nfrom django.urls import include, path\n\nurlpatterns = [\n ...\n path("app1/", include(\'app1.urls\')), # Here\n path("app2/", include(\'app2.urls\')) # Here\n]\nRun Code Online (Sandbox Code Playgroud)\n最后,我再次建议将templates文件夹放在文件夹下django-project,如下所示,因为您可以在一个地方轻松管理模板:
django-project\n |-core\n \xe2\x94\x82\xc2\xa0 |-settings.py\n \xe2\x94\x82\xc2\xa0 \xe2\x94\x94-urls.py\n |-app1\n | |-urls.py\n | \xe2\x94\x94-views.py\n |-app2\n | |-urls.py\n | \xe2\x94\x94-views.py\n \xe2\x94\x94-templates # Here\n |-app1\n | \xe2\x94\x94-a1.html\n \xe2\x94\x94-app2\n \xe2\x94\x94-a2.html\nRun Code Online (Sandbox Code Playgroud)\n
从在版本上测试的 Django 版本开始3,您需要将新应用程序添加到已安装的应用程序中。django 应用程序不需要更改其他代码
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'addyourappnamehere'
]
Run Code Online (Sandbox Code Playgroud)
如果您app从头开始添加时遇到此问题。可能是因为您错过了一些settings。添加时需要三个步骤app。
假设您有一个名为的项目,mysite并且想要添加一个appnamed 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
Run Code Online (Sandbox Code Playgroud)
app到INSTALLED_APPS。修改 settings.py
INSTALLED_APPS = [
...
'your_app_name',
...
]
Run Code Online (Sandbox Code Playgroud)
app目录添加到DIRS中TEMPLATES。修改settings.py。
TEMPLATES = [
{
...
'DIRS': [os.path.join(BASE_DIR, 'templates'),
os.path.join(BASE_DIR, 'your_app_name', 'templates', 'your_app_name'),
...
]
}
]
Run Code Online (Sandbox Code Playgroud)
DjangoTemplateDoesNotExist错误仅仅意味着框架找不到模板文件。
要使用模板加载 API,您需要告诉框架您存储模板的位置。执行此操作的位置是settings.py通过设置在您的设置文件 ( )中TEMPLATE_DIRS。默认情况下它是一个空元组,因此此设置告诉 Django 的模板加载机制在哪里查找模板。
选择您想要存储模板的目录并将其添加到 TEMPLATE_DIRS 例如:
TEMPLATE_DIRS = (
'/home/django/myproject/templates',
)
Run Code Online (Sandbox Code Playgroud)
对于 Django 1.9 版,我添加了
'DIRS': [os.path.join(BASE_DIR, 'templates')],
Run Code Online (Sandbox Code Playgroud)
行到 settings.py 中的 Templates 块,它运行良好
| 归档时间: |
|
| 查看次数: |
212017 次 |
| 最近记录: |