Django 中所有应用程序的基本模板

Posted

技术标签:

【中文标题】Django 中所有应用程序的基本模板【英文标题】:Base template for all apps in Django 【发布时间】:2015-06-12 02:39:15 【问题描述】:

我有一个包含 2 个应用程序的项目

project/
    blog/
        templates/
            index.html
    polls/
        templates/
            index.html
    project/
        templates/
            base.html
            index.html

现在我希望这两个应用程序扩展项目base.html。这是要走的路吗?这怎么可能?有更好的解决方案吗?

已经有一个问题正在处理这个问题,但只有在您使用拆分目录时才值得一提: Django project base template

tl;dr:我想使用拆分目录并想知道如何从多个应用程序扩展基本模板而不将其复制到每个应用程序

【问题讨论】:

已回复here 【参考方案1】:

在当前的 Django (1.10) TEMPLATE_DIRS is deprecated,所以:

    在项目根目录下添加templates目录,

    settings.py 中找到 TEMPLATES -> DIRS 并像这样添加它:

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

    base.html 添加到该目录。

    使用% extends 'base.html' % 将其扩展到任何你想要的地方

【讨论】:

感谢您的提示!不确定何时更改,但BASE_DIRpathlib.Path 对象,因此您可以编写BASE_DIR / "templates" 而不是使用os.path.join【参考方案2】:
    在项目根目录下添加templates 目录,并将其添加到您的TEMPLATE_DIRS 设置中。 将 base.html 添加到该目录。 使用% extends 'base.html' % 将其扩展到任何你想要的地方

【讨论】:

我已经完成了,我的设置如下所示:TEMPLATE_DIRS = (os.path.join(BASE_DIR, 'templates/'),) 但这仍然不起作用 去掉正斜杠。【参考方案3】:

对于 1.8 以上的 Django 版本,upgrade doc 建议将原版设置(对于像我这样的大多数非高级 django 探戈者)添加到您的 settings.py 中:

TEMPLATES = [
    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [(os.path.join(BASE_DIR, 'my_Templates_Directory')),],
        'APP_DIRS': True,
        'OPTIONS': 
            'context_processors': [
                # Insert your TEMPLATE_CONTEXT_PROCESSORS here or use this
                # list if you haven't customized them:
                'django.contrib.auth.context_processors.auth',
                'django.template.context_processors.debug',
                'django.template.context_processors.i18n',
                'django.template.context_processors.media',
                'django.template.context_processors.static',
                'django.template.context_processors.tz',
                'django.contrib.messages.context_processors.messages',
            ],
        ,
    ,
]

BACKEND 和 OPTIONS 都是必需的,否则我会遇到与“INVALID BACKEND”相关的错误,并且“django.contrib.auth.context_processors.auth”必须在 TEMPLATES 中。

【讨论】:

以上是关于Django 中所有应用程序的基本模板的主要内容,如果未能解决你的问题,请参考以下文章

如何从用户在 django 基本模板中创建的所有帖子中获取模型字段值的总和?

Django模板:使用其他语言获取当前URL

基本模板上的 Django 表单

Django 模板:获取另一种语言的当前 URL

Django2.2基本应用结构以及基本模板

Django -- Python -- 如何在一个项目中的所有应用程序之间共享一个全局模板标签