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

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

TemplateDoesNotExist at /appname/path appname/template_name.html Django尝试加载这些模板,顺序如下: 使用loader django.template.loaders. filessystem .function: 使用loader django.template.loaders.app_directories.function: TEMPLATE_DIRS (“/ usr / lib / python2.5 /网站/ projectname /模板”,)

在这种情况下,它是否在寻找/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 /模板/ appname1 / template1.html /usr/lib/python2.5/site-packages projectname /模板/ appname1 / template2.html /usr/lib/python2.5/site-packages projectname /模板/ appname2 / template3.html ...

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

解决了

在我尝试之后,它现在工作了:

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

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


这只是一种直觉,但是看看这篇关于Django模板加载的文章。特别地,确保你有django.template.loaders.app_directories。在TEMPLATE_LOADERS列表中的Loader。


检查templates.html是否在/usr/lib/python2.5/site-packages/projectname/templates目录下。


第一个解决方案:

这些设置

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会在每个已安装应用的模板/目录下加载模板。所以在你的目录结构中,我们想要移动我们的模板,就像这样:

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

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


我试过了,现在有用了

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

这是奇怪的。我不需要在远程服务器上这样做,使其工作。

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

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

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

有人知道为什么吗?


Django TemplateDoesNotExist错误仅仅意味着框架找不到模板文件。

要使用模板加载API,您需要告诉框架将模板存储在何处。这样做的地方是在你的设置文件(settings.py)通过TEMPLATE_DIRS设置。默认情况下,它是一个空元组,所以这个设置告诉Django的模板加载机制去哪里寻找模板。

选择一个你想要存储模板的目录,并将其添加到TEMPLATE_DIRS中,例如:

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

找到这个元组:

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

在设置.py时,删除TEMPLATE_LOADERS和TEMPLATE DIRS,然后添加

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

对于django 1.9版本,我添加了

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

一行到settings.py中的Templates块 而且效果很好


查看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)

在我的错误v证监会\ v证监会\templates\base.html不在路径。 然后将settings .py文件中的TEMPLATES更改为模板路径

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

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


我必须使用模板的内部应用程序,它为我工作:

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

我不好意思承认这一点,但对我来说,问题是一个模板被指定为....HML代替....html。小心!


如果你在从头开始添加应用程序时遇到这个问题。这可能是因为你错过了一些设置。添加应用程序需要三个步骤。

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

假设你有一个名为mysite的项目,你想添加一个名为your_app_name的应用程序。将模板文件放在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。

添加操作系统导入

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

我遇到了一个尴尬的问题……

我得到这个错误,因为我匆忙,忘记把应用程序在INSTALLED_APPS。您可能会认为Django会抛出一个描述性更强的错误。


我加上了这个

TEMPLATE_DIRS = (
    os.path.join(SETTINGS_PATH, 'templates'),
)

它仍然显示错误,然后我意识到在另一个项目中,模板显示没有在settings.py文件中添加该代码,所以我检查了该项目,我意识到我没有在这个项目中创建虚拟环境,所以我做了

virtualenv env 

它成功了,不知道为什么


我想到了这个问题。下面是我解决这个问题的方法:

查看settings.py,找到TEMPLATES变量, 在TEMPLATES中,在DIRS列表中添加你的模板路径。对我来说,首先我将模板路径设置为TEMPLATES_PATH = os.path.join(BASE_DIR,'templates'),然后将TEMPLATES_PATH添加到DIRS列表,' DIRS':[TEMPLATES_PATH,]。 然后重新启动服务器,TemplateDoesNotExist异常消失。 就是这样。


在你的set .py文件中,用这个替换TEMPLATES数组中的DIRS

'DIRS': []

这个

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

但我认为你需要知道的是 你必须创建一个带有名称模板的文件夹,它应该在根路径上,否则你必须改变DIRS值


1.创建一个文件夹“模板”在你的“应用程序”(让你这样命名你的应用程序) 你可以把HTML文件放在这里。 但强烈建议在“templates”文件夹中创建一个同名的文件夹(“app”),然后将html放在那里。进入'app/templates/app'文件夹

2.现在在'app'的urls.py中放入:

  path('', views.index, name='index'), # in case of  use default server index.html 

3.在'app'的views.py中输入:

from django.shortcuts import render 

def index(request): return
    render(request,"app/index.html")
    # name 'index' as you want

确保你已经把你的应用添加到project-name/app- name/ settings.py INSTALLED_APPS:。

INSTALLED_APPS = ['app-name.apps.AppNameConfig']

并且在project-name/app- name/ settings.py上的TEMPLATES:。

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

Django 3的工作原理

我发现我相信好方法,我有base.html在根文件夹,所有其他html文件在应用程序文件夹,我 settings.py

import os

# This settings are to allow store templates,static and media files in root folder

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATE_DIR = os.path.join(BASE_DIR,'templates')
STATIC_DIR = os.path.join(BASE_DIR,'static')
MEDIA_DIR = os.path.join(BASE_DIR,'media')

# This is default path from Django, must be added 
#AFTER our BASE_DIR otherwise DB will be broken.
BASE_DIR = Path(__file__).resolve().parent.parent

# add your apps to Installed apps
INSTALLED_APPS = [
    'main',
    'weblogin',
     ..........
]

# Now add TEMPLATE_DIR to  'DIRS' where in TEMPLATES like bellow
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [TEMPLATE_DIR, BASE_DIR,],
        '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',
            ],
        },
    },
]
# On end of Settings.py put this refferences to Static and Media files
STATICFILES_DIRS = [STATIC_DIR,]
STATIC_URL = '/static/'

MEDIA_ROOT = [MEDIA_DIR,]
MEDIA_URL = '/media/'

如果你的数据库有问题,请检查你是否把原来的BASE_DIR下面的新BASE_DIR,否则改变

# Original
'NAME': BASE_DIR / 'db.sqlite3',
# to
'NAME': os.path.join(BASE_DIR,'db.sqlite3'),

Django现在可以在App文件夹和根文件夹中找到HTML和静态文件,而不需要在文件前添加App文件夹的名称。

Struture:
-DjangoProject
    -static(css,JS ...)
    -templates(base.html, ....)
    -other django files like (manage.py, ....)
    -App1
        -templates(index1.html, other html files can extend now base.html too)
        -other App1 files
    -App2
        -templates(index2.html, other html files can extend now base.html too)
        -other App2 files

将rest_framework添加到INSTALLED_APPS if django rest框架。对于我来说,我没有把它添加到已安装的应用程序中。

INSTALLED_APPS = [
    '..........',,
    'rest_framework',
    '.........',
]

你应该在settings.py文件的templates的DIRS中输入'templates'。

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['templates'], <--- type here!
        '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',
            ],
        },
    },
]

“模板不存在”错误的另一个原因似乎是忘记在settings.py中添加应用程序名称。我忘了加上它,这就是我的案例中出现错误的原因。

INSTALLED_APPS = [
    'my_app',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

简单的解决方案

'DIRS': [BASE_DIR, 'templates'],


在我的情况下,只要将我的应用程序包含在settings.py文件中的INSTALLED_APPS中就足够了:

INSTALLED_APPS = [
    "myapp",
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
]

另外,记住模板应该像这样放在你的目录中: myapp /模板/ myapp / template_name.html 但是当你指向这个模板时,你可以这样做: Template = loader.get_template("myapp/template_name.html")


从Django版本3测试开始,你需要将你的新app添加到已安装的app中。对于一个Django app,不需要修改其他代码

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'addyourappnamehere'
]

我的问题是我改变了我的应用程序的名称。毫不奇怪,Visual Studio没有改变包含模板的目录名称。手动修正就解决了这个问题。


在模板:

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [r'C:\Users\islam\Desktop\html_project\django\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',
        ],
    },
},

]

将模板文件的完整目录放在视图中:

def home(request):
return render(request, "home\index.html")

启动模板后面的HTML文件路径

简而言之:

完整路径为: django C:\Users\islam\Desktop\ html_project \ \ templates \ \ index . html

django C:\Users\islam\Desktop\ html_project \ \模板 模板文件的完整路径将在TEMPLATES ` DIRS': [' '] Home \index.html模板后面的路径将在render()中显示


2022年5月更新:

只要你正确地遵循本教程,你不需要改变(触摸)“settings.py”中“TEMPLATES”的默认设置,如下所示:

# "core/settings.py"

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",
            ],
        },
    },
]

同样,只要你正确地遵循本教程,“模板”可以在应用程序文件夹下正确读取,如下所示:

root
├── core
│   ├── settings.py
│   ├── urls.py
│   ...
├── myapp1
│   ├── templates
│   │   └── myapp1
│   │       └── myapp1.html
│   ├── urls.py
│   ├── views.py
│   ...
├── myapp2
│   ├── templates
│   │   └── myapp2
│   │       └── myapp2.html
│   ├── urls.py
│   ├── views.py
│   ... 

而“templates”可以在django项目根目录下正确读取,如下所示:

root
├── core
│   ├── settings.py
│   ├── urls.py
│   ...
├── myapp1
│   ├── urls.py
│   ├── views.py
│   ...
├── myapp2
│   ├── urls.py
│   ├── views.py
│   ...
├── templates
│   ├── myapp1
|   |   └── myapp1.html
|   └── myapp2
|       └── myapp2.html   

所以,你需要做的关键事情就是不要改变(触摸)“settings.py”中“TEMPLATES”的默认设置,如下所示:

# "core/settings.py"

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",
            ],
        },
    },
]

然后,将“myapp1”和“myapp2”应用程序设置为“core/settings.py”中的“INSTALLED_APPS”,如下所示:

# "core/settings.py"

INSTALLED_APPS = [
    ...
    "myapp1",
    "myapp2",
]

然后,如下所示,编写“myapp1”和“myapp2”应用程序的每个“views.py”。注意,你需要把每个“模板”的路径写为“myapp1/myapp1.html”和“myapp2.html”,而不是在“render()”中只写每个“模板”的路径“myapp1.html”和“myapp2.html”,如下所示:

# "myapp1/views.py"

from django.shortcuts import render

def myapp1(request):       # Don't write just "myapp1.html"
    return render(request, "myapp1/myapp1.html")
# "myapp2/views.py"

from django.shortcuts import render

def myapp2(request):       # Don't write just "myapp2.html"
    return render(request, "myapp2/myapp2.html")

然后,设置“myapp1”和“myapp2”应用程序的“views.py”路径,如下图所示:

# "myapp1/views.py"

from django.urls import include, path

from . import views

urlpatterns = [
    path("", views.myapp1, name='myapp1'), # Here
]
# "myapp2/views.py"

from django.urls import include, path

from . import views

urlpatterns = [
    path("", views.myapp2, name='myapp2'), # Here
]

然后,将“core/urls.py”中的“myapp1”和“myapp2”应用程序的每个路径设置为“urls.py”,如下所示。最后,“myapp1”和“myapp2”应用程序的模板将被读取,没有任何错误:

# "core/urls.py"

from django.urls import include, path

urlpatterns = [
    ...
    path("myapp1/", include('myapp1.urls')), # Here
    path("myapp2/", include('myapp2.urls')), # Here
]

Django被配置为使用project_name/app_name/templates/app_name/template.html中的模板来渲染(request, 'app_name/template.html', context)

如果你得到模板异常,原因是你没有在设置中添加app_name到installed_apps。

我有django 4.1的问题