首页 文章

Django TemplateDoesNotExist?

提问于
浏览
102

我的本地机器在Ubuntu 8.10上运行Python 2.5和Nginx,Django从最新的开发中继构建 .

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

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

  • ......

以上所有文件都存在于磁盘上 .

Solved

它在我尝试后现在有效:

chown -R www-data:www-data /usr/lib/python2.5/site-packages/projectname/*

真奇怪 . 我不需要在远程服务器上执行此操作以使其工作 .

15 回答

  • 138

    First solution

    这些设置

    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
    

    Second solution

    如果仍然无效,并假设您在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__))
    
  • 0

    如果从头开始添加 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,将您的应用添加到INSTALLED_APPS .

    修改 settings.py

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

    3,在TEMPLATES中将您的应用目录添加到DIRS .

    修改 settings.py .

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

    在设置.py remove TEMPLATE_LOADERS和TEMPLATE DIRS然后 ADD

    TEMPLATES = [
     {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['/home/jay/apijay/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',
            ],
        },
     },
    ]
    
  • 4

    Django TemplateDoesNotExist 错误意味着框架无法找到模板文件 .

    要使用模板加载API,您需要告诉框架存储模板的位置 . 执行此操作的位置在 TEMPLATE_DIRS 设置的设置文件( settings.py )中 . 默认情况下,'s an empty tuple, so this setting tells Django'的模板加载机制在哪里查找模板 .

    选择您要存储模板的目录并将其添加到TEMPLATE_DIRS,例如:

    TEMPLATE_DIRS = (
      '/home/django/myproject/templates',
    )
    
  • 4

    我尝试后现在可以使用了

    chown -R www-data:www-data /usr/lib/python2.5/site-packages/projectname/*
    

    真奇怪 . 我不需要在远程服务器上执行此操作以使其工作 .

    此外,我必须在本地计算机上运行以下命令以使所有静态文件都可访问,但在远程服务器上它们都是“root:root” .

    chown -R www-data:www-data /var/www/projectname/*
    

    本地机器在Ubuntu 8.04桌面版上运行 . 远程服务器在Ubuntu 9.04服务器版上 .

    谁知道为什么?

  • 0

    大家好我找到了新的解决方案 . 实际上它是在另一个模板中定义的,所以不要自己定义TEMPLATE_DIRS,而是将目录路径名放在:

  • 4

    只是预感,但请查看this article on Django template loading . 特别是,请确保您的TEMPLATE_LOADERS列表中包含 django.template.loaders.app_directories.Loader .

  • 0

    看看django试图在错误页面中加载模板看 Template-loader postmortem 的文件夹,例如,错误会像这样:

    Template-loader postmortem
    
    Django tried loading these templates, in this order:
    
    Using engine django:
    django.template.loaders.filesystem.Loader: d:\projects\vcsrc\vcsrc\templates\base.html (Source does not exist)
    

    在我的错误 vcsrc\vcsrc\templates\base.html 不在路径中 .
    然后将 setting.py 文件中的 TEMPLATES 更改为模板路径

    TEMPLATES = [
        {    
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
             # 'DIRS': [], 
            'DIRS': [os.path.join(BASE_DIR, 'vcsrc/templates')], 
            ...
    
  • 3

    使用ls -l检查模板和appname目录的权限,或尝试从django执行绝对路径open() .

  • 3

    我必须使用内部APP的模板,它适用于我:

    'DIRS': [os.path.join(BASE_DIR + '/THE_APP_NAME', 'templates')],
    
  • 1

    我很尴尬承认这一点,但问题是我的模板被指定为 ….hml 而不是 ….html . 小心!

  • 1

    对于django 1.9版,我补充道

    'DIRS': [os.path.join(BASE_DIR, 'templates')],
    

    在settings.py中的模板块行,它运行良好

  • 0

    我有一个令人尴尬的问题......

    我收到此错误是因为我急于忘记将应用程序放在 INSTALLED_APPS 中 . 你会认为Django会提出更具描述性的内容错误 .

  • 33

    找到这个元组:

    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(SETTINGS_PATH, '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',
                ],
            },
        },
    ]
    
  • 0

    检查您的templates.html是否在 /usr/lib/python2.5/site-packages/projectname/templates dir中 .

相关问题