Django 全球 base.html 模板

Posted

技术标签:

【中文标题】Django 全球 base.html 模板【英文标题】:Django Global base.html template 【发布时间】:2016-05-16 17:29:33 【问题描述】:

我是 Django 新手。我将 Django 1.8.6 与 Python 2.7 一起使用。我正在尝试使用一个 base.html 模板,该模板可以在整个站点中全局使用,每个应用程序都可以在其中访问它。这是我的测试站点的当前结构:

twms

民意调查

迁移

静态

模板

项目

迁移

静态

模板

项目

index.html

tmws

静态

模板

tmws

base.html

这里是 project/templates/project/index.html 的代码

% extends 'tmws/base.html' %
% block content %
    <h1>Projects</h1>
    <ul>
    % for project in project_list %
        <li><a href="% url 'project:detail' project.id %"> project.name </a></li>
    % endfor %

    </ul>
    end of list
% endblock %

这是我收到的错误:

TemplateDoesNotExist at /project/

tmws/base.html

如何从我的任何应用访问 tmws/tmws/templates/tmws/base.html?

任何帮助将不胜感激!

如果需要任何其他信息,请告诉我。

编辑

这是我在 settings.py 中的模板设置:

TEMPLATES = [
    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates'),  # If i leave both or just comment one one out I still get the same error
            'tmws.tmws.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',
            ],
        ,
    ,
]

【问题讨论】:

您的模板设置中有什么? 【参考方案1】:

我认为您的模板目录配置可能有问题。在您的项目的 settings.py 中尝试检查您是否有类似的配置:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATES = [
    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'your template dir name')]
        ,
        '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',
            ],
        ,
    ,
]

'your template dir name' 应该是 tmws。每当您尝试在 HTML 中扩展模板时,这将使 django 搜索此目录。您可以根据需要添加任意数量的目录。

我认为现在 Django 必须在以下位置搜索模板:

twms/project/templates/project

所以也许如果你把你的 base.html 文件放在那里,Django 就能找到它。

另一个建议是创建一个通用模板目录并将您的 base.html 放在那里,因为您希望它在整个站点中使用。这只是我对订购模板的喜好,但无论哪种方式都应该有效。

编辑:

在 settings.py 中添加以下内容解决了这个问题。阅读 cmets 了解更多信息:

MASTER_BASE_DIR = os.path.dirname(__file__)




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

【讨论】:

不客气。您可以尝试添加:os.path.join(BASE_DIR, 'twms/templates')os.path.join(BASE_DIR, 'twms.templates')。我不确定我是否可以在那里使用点符号。 感谢您的所有帮助,但我仍然遇到同样的错误。出于某种原因,我无法离开项目目录。我不确定它是否与 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(file))) 有关。我已经尝试了很多方法来处理这个,但是当我得到这个页面不可用错误时 通过将以下变量添加到 settings.py MASTER_BASE_DIR = os.path.dirname(__file__) 然后将以下内容添加到 Temaplates = [ ... 'DIRS':[os.path .join(MASTER_BASE_DIR, '模板'),]]。将此添加到您的答案中,我会将其标记为正确。 被这个卡住了很长时间,因为我包含了一个基本文件,谢谢【参考方案2】:

检查设置中的 TEMPLATES 值。您可以将 DIR 选项添加到可以放置所有常用模板的目录中。

链接:https://docs.djangoproject.com/en/1.9/ref/settings/#templates

【讨论】:

【参考方案3】:

您需要将所有模板文件夹添加到 settings.py 中的 TEMPLATES 设置中。然后,Django 会将它们视为都在同一个文件夹中。好像您还没有添加所有这些。您希望您的模板看起来像这样:

TEMPLATES = [
    
        'DIRS': [
            'twms.tmws.templates',  # Since this is not in an app
        ],
        'APP_DIRS': True,  # Automatically include the templates from INSTALLED_APPS
    ,
]

【讨论】:

【参考方案4】:

您设置目录以搜索模板,如下所示:

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

应该改为:

        'DIRS': [os.path.join(MASTER_BASE_DIR, 'tmws/templates'),]

为什么?因为BASE_DIR定义如下:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
#       -> os.path.dirname(os.path.dirname(/your/path/tmws/tmws/settings.py))
#       -> /your/path/tmws/

因此 BASE_DIR 指向您的顶层文件夹,如果您随后将其与“模板”连接起来,它将变为:/your/path/tmws/templates,它不存在。但是,随着 DIRS 列表中的行更改,它将变为 /your/path/tmws/tmws/templates,这是正确的。

【讨论】:

以上是关于Django 全球 base.html 模板的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中扩展为“base.html”模板样式

全局视图 (base.html) 中的 Django 动态菜单在所有模板中可见

[py]django模板继承

Django 模板继承(扩展的位置)

Django 教程第 2 部分模板——base_site.html 更改未反映

Django模板扩展了错误的模板