首页 > 解决方案 > 无法从 3rd 方应用程序覆盖 django 模板

问题描述

我正在尝试覆盖django-machina的基本论坛模板。

我已将github 源board_base.html中的内容复制到 ./app/forum/templates/machina/board_base.html

我的设置文件包含一个模板部分,如:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates'),
            MACHINA_MAIN_TEMPLATE_DIR,
        ],
#snip

Django 肯定会在该目录中查找:如果我设置了一个指向不存在的模板文件的不同视图,那么在生成的错误页面上,Django 报告尝试的第一个路径是:

/app/forum/templates/nothing.html (Source does not exist)

我错过了什么?为什么我不能覆盖该模板?


编辑:

所以我DIRS现在看起来像:

'DIRS': [
    MACHINA_MAIN_TEMPLATE_DIR,
],

我有一个单独的应用程序,forum_templates它有自己的模板目录。INSTALLED_APPS好像:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'forum_templates',
    'core',

    # Machina related apps:
    'mptt',
    'haystack',
    'widget_tweaks',
] + get_machina_apps()

如果我注释掉MACHINA_MAIN_TEMPLATE_DIRfrom DIRS,我会得到预期的TemplateDoesNotExist错误,并列出以下路径:

/usr/local/lib/python3.6/site-packages/django/contrib/admin/templates/partials/breadcrumb.html
/usr/local/lib/python3.6/site-packages/django/contrib/auth/templates/partials/breadcrumb.html
/app/forum/forum_templates/templates/partials/breadcrumb.html
/app/forum/core/templates/partials/breadcrumb.html
/usr/local/lib/python3.6/site-packages/mptt/templates/partials/breadcrumb.html
/usr/local/lib/python3.6/site-packages/haystack/templates/partials/breadcrumb.html
/usr/local/lib/python3.6/site-packages/machina/templates/partials/breadcrumb.html

所以我从github复制相关文件并将其保存到/app/forum/forum_templates/templates/partials/breadcrumb.html;当我重新加载时,错误移动到下一个模板文件。

如果我然后添加MACHINA_MAIN_TEMPLATE_DIRDIRS.. 它会再次开始从 machina 加载所有默认模板,忽略我的forum_templates应用程序中的覆盖。

这是怎么回事?:(

标签: djangotemplates

解决方案


这对我有用:

from machina import MACHINA_MAIN_TEMPLATE_DIR

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': (
            [os.path.join(BASE_DIR, 'templates')],
            MACHINA_MAIN_TEMPLATE_DIR,
            ),
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                .... 
            ],
        },
    },
]

现在转到您的基本目录/templates并将原始 Machina 模板移动到这个新位置。请注意目录级别,您可能需要进行一些试验。删除原始 Machina 模板目录以强制它找到您的新文件。


推荐阅读