Django 模板不存在?

新手上路,请多包涵

我的本地机器在 Ubuntu 8.10 上运行 Python 2.5 和 Nginx,Django 是从最新的开发主干构建的。

对于我请求的每个 URL,它都会抛出:

TemplateDoesNotExist 在 /appname/path appname/template_name.html

Django 尝试按以下顺序加载这些模板: * 使用加载程序 django.template.loaders.filesystem.function: * 使用加载程序 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/*

真奇怪。我不需要在远程服务器上执行此操作即可使其正常工作。

原文由 jack 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 921
2 个回答

第一个解决方案

这些设置

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__))

原文由 Joshua Partogi 发布,翻译遵循 CC BY-SA 4.0 许可协议

找到这个元组:

     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(BASE_DIR, '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',
            ],
        },
    },
]

原文由 Bacs 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题