ChatGPT解决这个技术问题 Extra ChatGPT

Django 模板不存在?

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

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

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

...

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

解决了

我尝试后现在可以使用:

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

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

网络服务器可以读取您的 TEMPLATE_DIRS 吗?
@Jordan,根目录可以访问的 TEMPLATE_DIRS 就足够了。这是它在正在运行的远程服务器上配置的内容。

T
Trilarion

第一个解决方案:

这些设置

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

@jpartogi,我尝试了两种方法,但都不起作用。我什至尝试在 render_to_response() 参数中使用模板的绝对路径,但仍然没有用。
您的 django 项目在 /usr/lib/python2.5/site-packages/projectname/ 下吗?
@jpartogi,是的,所有已安装的应用程序都在 /usr/lib/python2.5/site-packages/projectname/appname1, ...
您能否编辑您的原始帖子并粘贴 settings.py。排除数据库配置:-d。谢谢。
Django TEMPLATE_DIRIs 自 1.8 起已弃用,docs.djangoproject.com/en/1.8/ref/settings/#template-dirs
a
artu-hnrq

找到这个元组:

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

SETTINGS_PATH 实际上并没有在任何地方定义,所以我认为这个答案不会奏效。也许您的意思是BASE_DIR
定义 SETTINGS_PATH = os.path.dirname(os.path.dirname(file))
我认为 Shapon Pal 的意思是 SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__)),而不是 file
谢谢这对我有用。设置 django 时需要编排很多小部分,因此这可能对某些人有用,但对其他人无效。在这篇文章的其他回复中也有很多好的解决方案!
W
W.Perrin

如果您在从头开始添加 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'),
                ...
                ]
    }
]

这是使用 django 2.2.7 对我有用的唯一解决方案
就我而言,仅缺少第 2 步。我可以将 DIRS 数组留空,它仍然可以工作,并在应用程序的正确模板目录中查找模板。
我的应用刚刚从 INSTALLED_APPS 中丢失,谢谢!
这种方式对我有用。感谢您的精彩分享。
S
Saurabh

在设置 .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',
        ],
    },
 },
]

C
Chris Conlan

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

我收到此错误是因为我赶时间并忘记将应用程序放入 INSTALLED_APPS。你会认为 Django 会引发一个更具描述性的错误。


K
Krishnadas PC

从在版本 3 上测试的 Django 版本开始,您需要将新应用添加到已安装的应用中。 django 应用程序不需要其他代码更改

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

K
Kapilfreeman

对于 django 1.9 版,我添加了

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

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


k
kenorb

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

要使用模板加载 API,您需要告诉框架您将模板存储在哪里。执行此操作的位置在您的设置文件 (settings.py) 中的 TEMPLATE_DIRS 设置。默认情况下它是一个空元组,所以这个设置告诉 Django 的模板加载机制在哪里寻找模板。

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

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

P
Peter Rowell

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


这对我有用。从文件系统上的 Django 应用程序加载模板。对于 INSTALLED_APPS 中的每个应用程序,加载程序都会查找模板子目录。如果该目录存在,Django 会在其中查找模板。
模板 = [{ 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'APP_DIRS': True, }]
k
kibitzer

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


j
jack

我尝试后现在可以使用

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 服务器版本上。

有人知道为什么吗?


M
Murdock Helscream

确保您已将您的应用添加到 project-name/app-namme/settings.py INSTALLED_APPS: 中。

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

project-name/app-namme/settings.py TEMPLATES: 上。

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

D
Diego Cortes

我必须为内部 APP 使用模板,它对我有用:

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

n
nguyên

查看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')], 
        ...

K
Krishna Jangid

在您的 setting.py 文件中,将 TEMPLATES 数组中的 DIRS 替换为此

'DIRS': []

对此

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

但是 1 认为你需要知道的是你必须创建一个名为 templates 的文件夹,它应该在根路径上,否则你必须更改 DIRS价值


M
Muhwezi Jerald basasa

如果 django rest 框架,将 rest_framework 添加到 INSTALLED_APPS。就我而言,我错过了将其添加到已安装的应用程序中。

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

A
AlexxBoro

在我的情况下,只需将我的应用程序包含在 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/templates/myapp/template_name.html 但是当您指向此模板时,您会这样做:template = loader.get_template("myapp/template_name.html")


K
Kai - Kazuya Ito

2022 年 5 月更新:

只要您正确地遵循this tutorial(convention),您就不需要在“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",
            ],
        },
    },
]

同样,只要您正确遵循 this tutorial(convention),无论 “templates”文件夹 是否在 应用程序文件夹“templates” > 如下图:

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

并且,“模板”文件夹是否位于根 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",
            ],
        },
    },
]

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

# "core/settings.py"

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

然后,编写“myapp1”和“myapp2”应用程序的每个“views.py”,如下所示。请注意,您需要编写每个“模板”路径“myapp1/myapp1.html”和“myapp2/myapp2.html”,而不是仅在“渲染”中编写每个“模板”路径“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
]

J
John Slegers

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


M
Massimiliano Kraus

https://i.stack.imgur.com/i1fu5.png


k
kokociel

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


K
Keval

我添加了这个

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

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

virtualenv env 

并且成功了,不知道为什么


b
brass monkey

我想出了这个问题。这是我解决这个问题的方法:

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


C
CodeToLife

1.在您的“应用程序”中创建一个文件夹“模板”(假设您为您的应用程序命名),您可以将html文件放在这里。但强烈建议在 'templates' 文件夹中创建一个具有相同名称('app')的文件夹,然后才将 htmls 放在那里。进入“应用程序/模板/应用程序”文件夹

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

n
nahakubuilder

适用于 Django 3

我发现我相信好方法,我在根文件夹中有 base.html,在 App 文件夹中有所有其他 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 文件夹和 Root 文件夹中找到 HTML 和 Static 文件,而无需在文件前面添加 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

A
Abdullah Ismail

简单的解决方案

'DIRS':[BASE_DIR,'模板'],


C
CraigP

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


S
Samsul Islam

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

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

I
Islam hamdi

在模板中:

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 文件的路径

简单来说 :

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

C:\Users\islam\Desktop\html_project\django\templates 模板文件的完整路径将在 'DIRS' 中的 TEMPLATES 中:['']

home\index.html 模板后面的路径将在 render()


e
en0ndev

您应该在 settings.py 文件中将 'templates' 键入到 TEMPLATES 的 DIRS。

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

这在我的 django 中不起作用。这就是为什么-1

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅