在django 1.11中覆盖管理模板
在django 1.11中覆盖管理模板
我无法让Django 1.11接受一个新的base_site.html文件:\n按照文档和一些帖子的说法,我将文件复制到了以下位置:\nBASE_DIR/templates/base_site.html 和 BASE_DIR/templates/admin/base_site.html\n在settings.py文件中:\n
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', ), }, }, ]
\n我尝试将文件放置在templates和templates/admin文件夹中:\n
>>> 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.11中,要覆盖Django admin的base_site.html模板,需要添加自定义的base_site.html文件,并将其路径设置为BASE_DIR/templates/admin/base_site.html。这是我最初的猜想,但我尝试过了,不确定正确的设置是什么,以使其工作。
有人在这个post中详细解释了这个问题,请查看这个post。还请查看这个方法。
解决方法:在项目的BASE_DIR路径下,创建一个templates文件夹,在templates文件夹下创建一个admin文件夹,并在admin文件夹内添加base_site.html文件,覆盖原有的Django admin的base_site.html模板。
问题的原因是在Django 1.11版本中,覆盖(admin)模板的方法发生了变化。在此版本中,如果想要覆盖admin模板,需要安装django-apptemplates,并将它作为一个加载器添加到settings.py文件中。同时,需要将APP_DIRS设置为False才能使这个方法生效。
解决方法是首先安装django-apptemplates库,然后在settings.py文件中的TEMPLATES列表中添加apptemplates.Loader作为加载器。具体修改如下:
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [PROJECT_DIR], 'APP_DIRS': False, 'OPTIONS': { 'loaders': [ # 添加加载器 '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。
在Django 1.11中,如果要覆盖管理界面(admin)的模板文件,必须将文件存在于templates文件夹下的admin文件夹中。具体文件路径如下所示:
your_project
├── your_project/
├── myapp/
├── templates/
│ └── admin/
│ └── base_site.html
其中,base_site.html文件的名称必须与原始admin文件夹中的文件名称相同。base_site.html文件的内容如下:
{% extends "admin/base.html" %}
# 在这里可以进行修改
根据文档和上述代码,我期望这样可以正常工作。但是,Django似乎并没有使用这个文件。
问题在于:我本来期望它能按照你描述的方式工作。但是该文件确实位于那个位置(参见上述打印输出),并且以{% extends开头(它是一个带有标题和品牌块修改的副本)。但是Django似乎没有使用它。
请检查你的应用程序文件夹,可能存在base_site.html文件。你不能在其他文件夹中有相同的文件,否则它会覆盖你自定义的admin base_site.html文件。