如何在Django项目之外有一个模板文件夹

时间:2016-11-03 10:00:36

标签: python django django-templates

我正在开发一个开源Django应用程序,并为它创建了一些设计。现在,客户希望使用自己的,受版权保护的设计。在阅读Django文档后,我创建了一个单独的私有GIT存储库,我想将其用于新设计。通过在设置中添加2个项目,我几乎可以使用它;在“funder_custom_templates”文件夹中查找模板的额外条目,以及在同一位置查找静态文件的额外条目。这就是我配置TEMPLATES和STATICFILES_DIR的方式:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(PROJECT_DIR, '..', '..', 'funder_custom_templates'),
            os.path.join(PROJECT_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',
                'fundraiser.context_processors.cart',
            ],
        },
    },
]
STATICFILES_DIRS = [
    os.path.join(PROJECT_DIR, '..', '..', 'funder_custom_templates','static'),
    os.path.join(PROJECT_DIR, 'static'),
]

当我按照预期创建funder_customer_templates / base.html和所有静态文件时,这适用于覆盖位于PROJECT_DIR / templates / base.html中的基本设计。但我也希望覆盖特定于应用的模板文件,例如blog / templates / blog / blog_index_page.html

我尝试将这些文件放在funder_custom_templates的根目录中,并尝试模仿funder_custom_templates中的app文件夹结构,但这不会加载特定于应用程序的模板。有办法解决这个问题吗?

具有文件夹结构的示例项目文件位于:https://github.com/acidjunk/funder/tree/develop/

1 个答案:

答案 0 :(得分:1)

由于您使用app_directories.Loader类加载模板(通过设置'APP_DIRS': True,指定),然后对于app specfic模板,Django将遍历您的INSTALLED_APPS设置以查找特定的模板文件。这里重要的是它按顺序执行。

因此,如果您要覆盖blog/templates/blog/blog_index_page.html,那么您需要在custom_blog/templates/blog/blog_index_page.html之前的应用程序中包含blog

我建议在自己的django应用程序和python包中包装所有自定义静态资源。这样,您只需从其私有存储库中安装该软件包,并将其添加到已安装的应用程序列表中,即可覆盖任何静态内容和模板。

有关模板加载的更多详细信息,请参阅Django的文档:https://docs.djangoproject.com/en/1.9/ref/templates/api/#django.template.loaders.app_directories.Loader