【问题标题】:Django template structure issuesDjango模板结构问题
【发布时间】:2017-05-28 06:33:18
【问题描述】:

我有一个 base.html 模板,我网站上的每个页面都将扩展它。但是,根据我收集到的信息,Django 要求模板应该在 app 目录中。从应用程序中,如何扩展我位于项目的 basedirectory/templates/ 中的模板?

这是我的目录的排序方式:

project/
|----templates/
|    |----base.html
|
|----app1/
|    |----templates/
|         |----app1/
|              |----base.html
|              |----index.html
|
|----app2/...

目前,我有 index.html 扩展 app1/base.html:

{% extends 'welcome/base.html' %}

但是,这并不理想,因为我想扩展 project/templates/base.html。从逻辑上讲,我的 app1 中不应该有模板。

Settings.py:

TEMPLATE_DIRS = (
    # Don't forget to use absolute paths, not relative paths.
    os.path.join(PROJECT_ROOT, 'templates').replace('\\', '/'),
)

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

错误是当我的 app1/views.py 尝试渲染时:

{% extends 'welcome/base.html' %}

【问题讨论】:

    标签: python django django-templates


    【解决方案1】:

    您可以使用{% extends 'base.html' %}。所有模板目录都属于同一个命名空间。基本模板在哪个模板目录中并不重要,唯一重要的是它与模板目录的相对路径。

    这也是为什么您应该为特定应用模板使用前缀的原因。如果你没有,并且同时拥有project/templates/base.htmlapp1/templates/base.html,Django 会将它们视为同一个文件,其中一个会覆盖另一个。

    TEMPLATE_DIRS 设置已弃用,取而代之的是 TEMPLATES,如果设置了后者,TEMPLATE_DIRS 将被忽略。您应该将目录添加到'DIRS'

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(PROJECT_ROOT, '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',
                ],
            },
        },
    ]
    

    【讨论】:

    • 这是我尝试的第一件事,我得到了同样的错误“TemplateDoesNotExist at /”。
    • @user3750325 然后你应该显示错误和你的模板设置。
    • 我更新了我的问题以显示 settings.py 和错误!
    • 嗯,所以我删除了 TEMPLATE_DIRS 并将路径插入到 DIRS 中。然而,什么都没有。
    • @user3750325 os.path.join(PROJECT_ROOT, 'templates') 是否为您提供了正确的路径?确保也重新启动您的服务器。
    猜你喜欢
    • 2021-06-17
    • 2018-06-19
    • 1970-01-01
    • 2010-11-16
    • 2012-01-26
    • 2012-05-14
    • 1970-01-01
    • 2015-06-19
    • 2015-11-15
    相关资源
    最近更新 更多