模板不存在/错误异常 at-loader.py 第 43 行
Posted
技术标签:
【中文标题】模板不存在/错误异常 at-loader.py 第 43 行【英文标题】:Template does not exist at / error exception at- loader.py line 43 【发布时间】:2017-04-23 19:27:09 【问题描述】:我正在尝试为我的 django 项目创建一个主页。我不断收到此错误:
TemplateDoesNotExist at /
home.html
Request Method: GET
Request URL: http://xtradev.local/
Django Version: 1.9
Exception Type: TemplateDoesNotExist
Exception Value:
home.html
Exception Location: /home/epic/EPIC/venv/lib/python2.7/site-packages/django/template/loader.py in get_template, line 43
Python Executable: /usr/bin/python
Python Version: 2.7.9
Python Path:
['/home/epic/EPIC/EPIC-PROJECT/EPIC-Django/EPIC_AR',
'/home/epic/EPIC/venv/lib/python2.7/site-packages',
'/usr/lib/python2.7',
'/usr/lib/python2.7/plat-x86_64-linux-gnu',
'/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-old',
'/usr/lib/python2.7/lib-dynload',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages/PILcompat',
'/usr/lib/python2.7/dist-packages/gst-0.10',
'/usr/lib/python2.7/dist-packages/gtk-2.0',
'/usr/lib/pymodules/python2.7']
Server time: Thu, 8 Dec 2016 14:04:41 +0000
我的 settings.py 如下所示:
TEMPLATES = [
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, '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',
],
,
,
]
我的模板文件夹位于我的项目文件夹中,并包含一个 home.html
这是来自 loader.py 的代码(但我不知道它在做什么/确切地请求):
def get_template(template_name, dirs=_dirs_undefined, using=None):
"""
Loads and returns a template for the given name.
Raises TemplateDoesNotExist if no such template exists.
"""
chain = []
engines = _engine_list(using)
for engine in engines:
try:
# This is required for deprecating the dirs argument. Simply
# return engine.get_template(template_name) in Django 1.10.
if isinstance(engine, DjangoTemplates):
return engine.get_template(template_name, dirs)
elif dirs is not _dirs_undefined:
warnings.warn(
"Skipping template backend %s because its get_template "
"method doesn't support the dirs argument." % engine.name,
stacklevel=2)
else:
return engine.get_template(template_name)
except TemplateDoesNotExist as e:
chain.append(e)
raise TemplateDoesNotExist(template_name, chain=chain)
一切似乎都是正确的,我不确定我忽略了什么。有什么想法吗?
更新: VIEWS.PY
from django.contrib.auth.models import User, Group
from django.shortcuts import render, HttpResponse
from rest_framework import filters
from rest_framework import viewsets
from serializers import UserSerializer, GroupSerializer
def home(request):
return render(request, ('home.html'))
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
URLS.PY
admin.site.site_header = 'EPIC.AR Administration'
urlpatterns = [
url(r'^$', 'EPIC_AR.views.home', name='Home'),
url(r'^admin/', admin.site.urls),
url(r'^api/1.0/', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]
Template-loader postmortem
Django tried loading these templates, in this order:
Using engine django:
django.template.loaders.filesystem.Loader: /home/epic/EPIC/EPIC-PROJECT/EPIC-Django/EPIC_AR/templates/home.html (Source does not exist)
django.template.loaders.app_directories.Loader: /home/epic/EPIC/venv/lib/python2.7/site-packages/suit/templates/home.html (Source does not exist)
django.template.loaders.app_directories.Loader: /home/epic/EPIC/venv/lib/python2.7/site-packages/django/contrib/admin/templates/home.html (Source does not exist)
django.template.loaders.app_directories.Loader: /home/epic/EPIC/venv/lib/python2.7/site-packages/django/contrib/auth/templates/home.html (Source does not exist)
django.template.loaders.app_directories.Loader: /home/epic/EPIC/venv/lib/python2.7/site-packages/rest_framework/templates/home.html (Source does not exist)
django.template.loaders.app_directories.Loader: /home/epic/EPIC/venv/lib/python2.7/site-packages/crispy_forms/templates/home.html (Source does not exist)
django.template.loaders.app_directories.Loader: /home/epic/EPIC/EPIC-PROJECT/EPIC-Django/EPIC_AR/home/templates/home.html (Source does not exist)
【问题讨论】:
这个错误是在你的项目中,还是在一个应用程序中?如果只有一个应用,则显示此应用的视图 还有一个问题,home.html
存在于哪里?
我猜我的项目 - 我只有一个模板,我正试图将其用作主页。我没有其他人。我试过把它放在一个应用程序中,但这也不起作用。 home.html 存在于应用程序级别的主项目文件夹中 - 不在应用程序中,也不在与 settings.py 相同的文件夹中(虽然它之前处于该级别)我移动它以尝试不同的东西。
所以,请出示您的 view.py
和 urls.py
通常错误页面会告诉你 Django 尝试加载模板的位置。如果是这样,请在您的问题中加入。
【参考方案1】:
通常当我收到此错误时,我忘记将应用程序添加到 INSTALLED_APPS
设置。
默认加载器在TEMPLATES['DIRS']
中查找,然后在INSTALLED_APPS
中指定的每个应用程序的根目录中查找模板文件夹
【讨论】:
所有应用都安装在settings.py中。我的模板文件夹位于主项目文件夹中。我把它放在主要的,然后我把它提升了一个层次,看看这是否有帮助。因此,它目前与项目中的所有应用处于同一级别。【参考方案2】:根据您的视图和设置文件,home.html
必须位于 templates
文件夹中。
所以改变视图中home.html
的路径,从:
def home(request):
return render(request, ('home.html'))
到
def home(request):
return render(request, ('pathtoapp/home.html'))
或将home.html
移动到templates
的根目录中
【讨论】:
不。刚试了一下。相同的错误,除了现在它列出了文件路径:TemplateDoesNotExist at /EPIC_AR/templates/epicar/home.html 请求方法:GET 请求 URL:xtradev.local Django 版本:1.9 异常类型:TemplateDoesNotExist 异常值:/EPIC-Django/EPIC_AR/ templates/epicar/home.html 异常位置:/home/epic/EPIC/venv/lib/python2.7/site-packages/django/template/loader.py in get_template,第 43 行 很难回答你的问题,因为我没有看到你的项目的完整结构和文件夹名称【参考方案3】:这是建议的组合 - 只是我猜想得到正确的顺序。
我添加了home.html所在的目录:(在views.py中)
def home(request):
return render(request, 'epicar/home.html')
然后我将模板文件夹移回主项目目录:
sudo service apache2 restart
还有哇!
没有错误。 :)
【讨论】:
这也取决于你使用的 Django 版本。对于版本 3. >,您可能不需要包含 'DIRS': [os.path.join(BASE_DIR, 'templates')],因为 Django 有一种在您的项目中自动处理模板定义的方法。理想的做法是在返回渲染的模板之前确保您的所有应用目录在应用名称目录中都有模板/应用名称。【参考方案4】:在 setting.py insatalledApp , DIRS['templates'] 中正确写入你的“模板”名称并重新启动服务器
【讨论】:
以上是关于模板不存在/错误异常 at-loader.py 第 43 行的主要内容,如果未能解决你的问题,请参考以下文章