Django 找不到我的模板
Posted
技术标签:
【中文标题】Django 找不到我的模板【英文标题】:Django Can't Find My Templates 【发布时间】:2011-05-03 04:15:37 【问题描述】:我在 Windows XP SP3 上运行 Python 2.6.1 和 Django 1.2.1。我正在使用 JetBrains PyCharm 1.0 创建和部署我的 Django 应用程序。
我对 Python 相对缺乏经验,我开始学习 Django,并从网站 - poll 应用程序中跟随“编写你的第一个 Django 应用程序”。我被困在part 3。
当我为“编写你的第一个视图”添加简单的回调函数时,一切都很好。
当我谈到“编写实际做某事的视图”时,我遇到了障碍。
我按照说明修改了索引视图:
-
在 views.py 中添加一个新方法(注意 - 模板已从 'polls/index.html' 准备好):
将 index.html 模板添加到
site-templates/polls/
文件夹
修改 settings.py 以指向 site-templates
文件夹
这是我的views.py中的代码:
from django.template import Context, loader
from polls.models import Poll
from django.http import HttpResponse
def index(request):
latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
t = loader.get_template('polls/index.html')
c = Context(
'latest_poll_list': latest_poll_list,
)
return HttpResponse(t.render(c))
这是我的 settings.py 中的一行:
TEMPLATE_DIRS = ('/site-templates/')
但我在运行时仍然收到此消息:
TemplateDoesNotExist at /polls/
polls/index.html
Request Method: GET
Request URL: http://localhost:8000/polls/
Django Version: 1.2.1
Exception Type: TemplateDoesNotExist
Exception Value:
polls/index.html
异常在 loader.py 中抛出。我的调试设置如下所示:
TEMPLATE_CONTEXT_PROCESSORS
('django.core.context_processors.auth', 'django.core.context_processors.request')
TEMPLATE_DEBUG
True
TEMPLATE_DIRS
('/site-templates',)
TEMPLATE_LOADERS
('django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader')
我的目录结构如下:
我错过了什么? settings.py 不正确吗?请指教。
【问题讨论】:
你两次指定TEMPLATE_DIRS
的内容(第2次正确,第1次错误)。你真正使用的是哪一个?
您可以发布您的文件夹层次结构吗?
第一个条目来自我的settings.py;第二个是当我调用 URL 时回显到浏览器中的内容。
当您将调试回溯中的值放入 settings.py 中,替换您已有的值时会发生什么?
现在我的应用和管理 URL 出现问题。
【参考方案1】:
我也遇到了同样的问题。我的错误是,“应用程序”不在项目 settings.py 文件的 INSTALLED_APPS
列表中。
该错误引发了一条错误消息,它们暗示了类似的错误。
line 25, in get_template TemplateDoesNotExist(template_name, chain=chain)
django.template.exceptions.TemplateDoesNotExist: authControll/index.html
settings.py --> 应用定义
INSTALLED_APPS = [
...,
'authControll'
]
【讨论】:
如果您刚开始使用 django,这可能会解决您的问题。【参考方案2】:您必须在TEMPLATE_DIRS
设置中使用绝对路径。
方便的做法,在设置顶部插入:
import os
DIRNAME = os.path.abspath(os.path.dirname(__file__))
然后在任何使用路径的地方,使用os.path.join
。
例如,您的 TEMPLATE_DIRS
将变为:
TEMPLATE_DIRS = (
os.path.join(DIRNAME, 'site-templates/'),
)
【讨论】:
对不起,我从来没有在 Windows 上使用过 django 甚至 python。我不知道的路径一定有怪癖 我在 linux 和 windows 上都看到过这个。他抱怨的是 Template_dirs 没有作为列表正确遍历。理论上,您应该能够通过执行递归列表和搜索模板文件夹来指定应用程序特定的模板目录。然后将它们附加到列表中。多个条目 Template_dirs 列表要么 a) 不直观地解析,要么 b) 根本无法解析。我怀疑后者,因为调试输出只给我一个文件打开失败/文件不存在错误,这是第一个条目。【参考方案3】:Django 有一种模式和哲学。尝试使用相同的配置,否则您必须更改 django 中的核心模式。
django 中的模板模式是这样的:
polls/templates/polls/index.html
但要使用它,您必须在配置中添加已安装的应用程序:
INSTALLED_APPS = [
'polls.apps.PollsConfig', #<-- Here this shoud be solve it
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',]
更多信息请看:
https://docs.djangoproject.com/en/3.0/intro/tutorial02/#activating-models
【讨论】:
【参考方案4】:我的错误只是定位不好:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'histories',
]
我的解决方案是:
INSTALLED_APPS = [
'histories',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
【讨论】:
【参考方案5】:这肯定会解决问题,而不是以上所有尝试仅在settings.py
中添加以下行:
TEMPLATE_DIRS = (
"appname/templates",
)
【讨论】:
您能否解释一下为什么您认为这会肯定会解决问题? 这没有意义,因为 OP 的模板甚至不存在于应用程序文件夹中,这在帖子中很明显。【参考方案6】:http://docs.djangoproject.com/en/1.2/ref/templates/api/#loading-templates @zsquare 答案的小修复:
import os
DIRNAME = os.path.abspath(os.path.dirname(__file__))
TEMPLATE_DIRS = ( DIRNAME+'/site-templates/' )
【讨论】:
这很糟糕,它没有修复任何东西,而是因为没有元组而破坏了TEMPLATE_DIRS
。以上是关于Django 找不到我的模板的主要内容,如果未能解决你的问题,请参考以下文章