Django (grappelli):如何将我自己的 css 添加到所有页面或如何扩展管理员的 base.html?
Django (grappelli): how add my own css to all the pages or how to extend admin's base.html?
在 Django grappelli 中,如何将自己的 css 文件添加到所有管理页面?或者有没有办法扩展管理员的 base.html
模板?
- 如果您想更改管理员的一般外观,您应该覆盖管理员模板。这在此处有详细介绍:覆盖管理模板。有时你可以只扩展原始管理文件,然后覆盖一个块,例如 django/contrib/admin/templates/admin/base.html 中的 {% block extrastyle %}{% endblock %}。
- 如果您的样式是特定于模型的,则可以通过 admin.py 中的媒体元 class 添加其他样式。请在此处查看示例:
class MyModelAdmin(admin.ModelAdmin):
class 媒体:
js = ('js/admin/my_own_admin.js',)<br>
css = {
'all': ('css/admin/my_own_admin.css',)
}
我找到了复杂的解决方案。首先,我找到了一个 python package 可以帮助您告诉 Django 模板加载器您的模板与其他模板相比具有最高优先级。
pip install django-templateloaderwithpriorities
在你的 django 设置文件中放入下一个代码:
TEMPLATE_LOADERS = ('templateloaderwithpriorities.Loader', ) + TEMPLATE_LOADERS
TEMPLATE_LOADER_PRIORITIES = ['project/admin/templates']
- 在
project/static/css/admin/extra_admin.css
中输入你的 css.
在project/admin/templates/admin/base_site.html
(不在base.html
!)中输入下一个代码:
{% extends 'admin/base.html' %}
{% load staticfiles %}
{% block javascripts %}
{{ block.super }}
<script>alert('OK')</script>
{% endblock %}
{% block stylesheets %}
<link rel="stylesheet" href="{% static 'css/admin/extra_admin.css' %}">
{{ block.super }}
{% endblock %}
- 就是这样!当您转到站点管理页面时,您会看到 javascript 警报 "OK",因此在我的示例中,我还包含了一个自定义 js。
Django Grappelli 一切正常。
我刚才偶然发现了同样的问题,但我不记得我是在哪里找到这个解决方案的。
如果您不想在您的项目中包含额外的依赖项,您可以使用一些技巧:显然,您不能只覆盖 admin/base.html
模板并告诉它扩展 admin/base.html
, 因为那会引用它自己。
但是,您可以添加另一个指向 grappelli 模块位置(而不是 templates
位置)的模板目录。设置看起来像这样:
import os
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'APP_DIRS': True,
'DIRS': [
'your/normal/templates/path',
os.path.dirname(grappelli.__file__)
]
},
]
这样您可以创建一个 admin/base.html
模板,它将扩展 templates/admin/base.html
- 后者是管理界面的 grappelli 基础模板。
admin 'base.html' 模板可以通过在主应用程序文件夹中创建一个 admin 目录来扩展。在 admin 目录中创建一个名为 base.html 的新文件。将这些行复制到新文件中。
{% extends 'admin/base.html' %}
{% load staticfiles %}
{% block javascripts %}
{{ block.super }}
<script type="text/javascript" src="{% static 'app/js/action.js' %}"></script>
{% endblock %}
{% block stylesheets %}
{{ block.super }}
{% endblock %}
在这里,我使用新脚本覆盖了我的 javascript。
在 Django grappelli 中,如何将自己的 css 文件添加到所有管理页面?或者有没有办法扩展管理员的 base.html
模板?
- 如果您想更改管理员的一般外观,您应该覆盖管理员模板。这在此处有详细介绍:覆盖管理模板。有时你可以只扩展原始管理文件,然后覆盖一个块,例如 django/contrib/admin/templates/admin/base.html 中的 {% block extrastyle %}{% endblock %}。
- 如果您的样式是特定于模型的,则可以通过 admin.py 中的媒体元 class 添加其他样式。请在此处查看示例:
class MyModelAdmin(admin.ModelAdmin):
class 媒体:
js = ('js/admin/my_own_admin.js',)<br>
css = {
'all': ('css/admin/my_own_admin.css',)
}
我找到了复杂的解决方案。首先,我找到了一个 python package 可以帮助您告诉 Django 模板加载器您的模板与其他模板相比具有最高优先级。
pip install django-templateloaderwithpriorities
在你的 django 设置文件中放入下一个代码:
TEMPLATE_LOADERS = ('templateloaderwithpriorities.Loader', ) + TEMPLATE_LOADERS TEMPLATE_LOADER_PRIORITIES = ['project/admin/templates']
- 在
project/static/css/admin/extra_admin.css
中输入你的 css. 在
project/admin/templates/admin/base_site.html
(不在base.html
!)中输入下一个代码:{% extends 'admin/base.html' %} {% load staticfiles %} {% block javascripts %} {{ block.super }} <script>alert('OK')</script> {% endblock %} {% block stylesheets %} <link rel="stylesheet" href="{% static 'css/admin/extra_admin.css' %}"> {{ block.super }} {% endblock %}
- 就是这样!当您转到站点管理页面时,您会看到 javascript 警报 "OK",因此在我的示例中,我还包含了一个自定义 js。
Django Grappelli 一切正常。
我刚才偶然发现了同样的问题,但我不记得我是在哪里找到这个解决方案的。
如果您不想在您的项目中包含额外的依赖项,您可以使用一些技巧:显然,您不能只覆盖 admin/base.html
模板并告诉它扩展 admin/base.html
, 因为那会引用它自己。
但是,您可以添加另一个指向 grappelli 模块位置(而不是 templates
位置)的模板目录。设置看起来像这样:
import os
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'APP_DIRS': True,
'DIRS': [
'your/normal/templates/path',
os.path.dirname(grappelli.__file__)
]
},
]
这样您可以创建一个 admin/base.html
模板,它将扩展 templates/admin/base.html
- 后者是管理界面的 grappelli 基础模板。
admin 'base.html' 模板可以通过在主应用程序文件夹中创建一个 admin 目录来扩展。在 admin 目录中创建一个名为 base.html 的新文件。将这些行复制到新文件中。
{% extends 'admin/base.html' %}
{% load staticfiles %}
{% block javascripts %}
{{ block.super }}
<script type="text/javascript" src="{% static 'app/js/action.js' %}"></script>
{% endblock %}
{% block stylesheets %}
{{ block.super }}
{% endblock %}
在这里,我使用新脚本覆盖了我的 javascript。