Django 模板不存在?

249 投票
32 回答
531266 浏览
提问于 2025-04-15 17:09

我的本地机器上运行的是Python 2.5和Nginx,操作系统是Ubuntu 8.10,Django是从最新的开发版本构建的。

每当我请求一个网址时,它都会报错:

在 /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找不到它呢?

我在一台远程服务器上运行同样的应用程序,使用的是Python 2.6和Ubuntu 9.04,没有遇到这个问题。其他设置都是一样的。

我的本地机器上是不是有什么配置错误,或者有什么可能导致这种错误的地方我应该去检查一下?

在我的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/*

这很奇怪。我在远程服务器上不需要这样做就能让它工作。

32 个回答

82

如果你在从零开始添加一个 app 时遇到这个问题,可能是因为你漏掉了一些 settings 设置。添加一个 app 需要三个步骤。

1、创建目录和模板文件。

假设你有一个项目叫 mysite,你想添加一个叫 your_app_nameapp。你需要把模板文件放在 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

2、把你的 app 加入到 INSTALLED_APPS

修改 settings.py 文件。

INSTALLED_APPS = [
    ...
    'your_app_name',
    ...
]

3、把你的 app 目录添加到 TEMPLATESDIRS 中。

同样修改 settings.py 文件。

还需要添加 os 的导入。

import os
TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates'),
                 os.path.join(BASE_DIR, 'your_app_name', 'templates', 'your_app_name'),
                ...
                ]
    }
]
93

找到这个元组:

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

第一种解决方案:

这些设置

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

撰写回答