我的本地机器运行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/*

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


当前回答

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

其他回答

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
]

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

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

确保你已经把你的应用添加到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')],

找到这个元组:

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