【发布时间】:2018-06-26 14:30:12
【问题描述】:
我刚刚在 Heroku 上部署了我的 Django 站点,但我收到了 TemplateNotFoundError:
Traceback (most recent call last):
2018-01-17T16:17:41.010548+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/exception.py", line 35, in inner
2018-01-17T16:17:41.010548+00:00 app[web.1]: response = get_response(request)
2018-01-17T16:17:41.010549+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py", line 128, in _get_response
2018-01-17T16:17:41.010550+00:00 app[web.1]: response = self.process_exception_by_middleware(e, request)
2018-01-17T16:17:41.010551+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
2018-01-17T16:17:41.010551+00:00 app[web.1]: response = wrapped_callback(request, *callback_args, **callback_kwargs)
2018-01-17T16:17:41.010552+00:00 app[web.1]: File "/app/workoutcal/views.py", line 51, in redirect_to_calendar
2018-01-17T16:17:41.010553+00:00 app[web.1]: return calendar(request, year = today.year, month = today.month)
2018-01-17T16:17:41.010554+00:00 app[web.1]: File "/app/workoutcal/views.py", line 56, in calendar
2018-01-17T16:17:41.010554+00:00 app[web.1]: return prompt_login(request)
2018-01-17T16:17:41.010555+00:00 app[web.1]: File "/app/workoutcal/views.py", line 286, in prompt_login
2018-01-17T16:17:41.010556+00:00 app[web.1]: return render(request, 'workoutcal/prompt_login.html')
2018-01-17T16:17:41.010556+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/shortcuts.py", line 36, in render
2018-01-17T16:17:41.010557+00:00 app[web.1]: content = loader.render_to_string(template_name, context, request, using=using)
2018-01-17T16:17:41.010558+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/template/loader.py", line 62, in render_to_string
2018-01-17T16:17:41.010559+00:00 app[web.1]: return template.render(context, request)
2018-01-17T16:17:41.010559+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/template/backends/django.py", line 63, in render
2018-01-17T16:17:41.010560+00:00 app[web.1]: reraise(exc, self.backend)
2018-01-17T16:17:41.010561+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/template/backends/django.py", line 84, in reraise
2018-01-17T16:17:41.010561+00:00 app[web.1]: raise new from exc
2018-01-17T16:17:41.010565+00:00 app[web.1]: django.template.exceptions.TemplateDoesNotExist: workout/base.html
我已经按照this 的建议做了回答:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATE_DIRS = (
os.path.join(BASE_DIR, "templates"),
)
但它没有帮助。
这里有什么问题?
PS:在我的本地机器上一切正常。 (更新:这不是真的,因为我在本地使用另一个设置文件。我的错。)
更新:
改成这样:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, "templates")],
}
]
同样的问题仍然存在。
更新 2:
我把它放在设置中:
path = os.path.join(BASE_DIR, "templates")
print("\n\n\n\n\n\nHERE'S THE PATH: "+str(path))
它产生了这个:
HERE'S THE PATH: /app/workout/templates
我不知道这是否是 Heroku 中模板文件所在的位置。如何查看?
这是 base.html 在我的项目中的位置:
那就是workout/templates/workout/base.html(不包括根项目文件夹)。比较这两条路径,它们似乎并不指向同一件事。实际检查的第一个是缺少另一个步骤workout 与base.html 位于同一文件夹中。这是问题吗?我该如何解决?
【问题讨论】:
-
django 版本是多少?能否确保右视图中的
template_name指向templates目录中的现有模板? -
2.0.不知道你的第二个问题是什么意思,伙计。
-
在 django
settings.py中,TEMPLATES[x]['DIRS']是 django 应该查找模板的目录列表。它正在寻找的确切模板在template_name的视图中命名(对于 CBV)。因此,如果您的结构相似:templates/sth/my_template.html意味着,您应该像这样配置您的视图:template_name=sth/my_template.html。你能确保它是正确的吗? -
请注意,回溯中提到了
prompt_login- 您可能会发现,如果您在本地计算机上注销,则会收到类似的错误。 -
由于你的设置是一个目录而不是一个文件,你可能需要在设置
BASE_DIR时再添加一个os.path.dirname(),这样才能设置到项目目录下。