【问题标题】:Overriding Admin Templates in django 1.11在 django 1.11 中覆盖管理模板
【发布时间】:2018-02-01 19:08:12
【问题描述】:

我没有让 django 1.11 接受新的 base_site.html:

按照文档和一些帖子,我将文件复制到: BASE_DIR/templates/base_site.html 和 BASE_DIR/templates/admin/base_site.html

在 settings.py 中:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        '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',
            ],
            'loaders': (
                 'django.template.loaders.filesystem.Loader',
                 'django.template.loaders.app_directories.Loader',
            ),
        },
    },
]

我用模板和模板/管理中的文件尝试过:

>>> print ( os.path.isfile((os.path.join(settings.BASE_DIR, 'templates', 'admin','base_site.html'))) )
True
>>> print ( os.path.isfile((os.path.join(settings.BASE_DIR, 'templates', 'base_site.html'))) )
True

【问题讨论】:

    标签: django


    【解决方案1】:

    如果您想覆盖管理文件,他们必须exist in admin folder inside templates folder 如下所示
    你的项目

    your_project
         |-- your_project/
         |-- myapp/
         |-- templates/
              |-- admin/
                 |-- base_site.html
    

    此处的文件名base_site.html必须与原admin文件夹中的文件名相同。

    base_site.html

    {% extends "admin/base.html" %}
    
    # you can write changes here
    

    【讨论】:

    • 这就是我在文档中看到的,以及它现在的实际样子。但是 django 好像不会用。
    • 问题是:我怀疑它完全按照您描述的方式工作。但是该文件位于该位置(参见上面的打印)并以 {% extends 开头(它是在标题和品牌块中进行了修改的副本)。但是 django 好像不会用。
    • @devlanger 查看您的应用程序文件夹中可能存在base_site.html。您不能在其他文件夹中有相同的文件,它将覆盖您的自定义管理员base_site.html 文件
    【解决方案2】:

    刚刚遇到这个问题并通过安装 django-apptemplates 并将其作为加载程序添加到 settings.py 中来修复它:

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [PROJECT_DIR],
            'APP_DIRS': False,
            'OPTIONS': {
                'loaders': [
                    # ADD LOADER HERE
                    'apptemplates.Loader',
                    'django.template.loaders.filesystem.Loader',
                    'django.template.loaders.app_directories.Loader',
                ],
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    

    **APP_DIRS 必须设置为 False 才能正常工作

    【讨论】:

      【解决方案3】:

      要覆盖 Django 管理员的 base_site.html,请添加自定义 base_site.html,使其路径为 BASE_DIR/templates/admin/base_site.html。这也适用于 Django 1.11。

      【讨论】:

      • 也是我的第一个猜测,但我试过了。我不确定正确的设置是什么,才能正常工作。
      • 这个post详细解释了它。也请检查此method