在Django中覆盖Admin CSS


Answers:


110

这取决于您要做什么。虽然首先:不要直接在Django管理员中覆盖它。我认为您有两种选择是合理的:

  1. 通常,如果您想更改管理员的外观,则应覆盖管理模板。此处详细介绍:覆盖管理模板。有时候,你可以扩展原始管理文件,然后覆盖块就像{% block extrastyle %}{% endblock %}django/contrib/admin/templates/admin/base.html作为一个例子。
  2. 如果您的样式是特定于模型的,则可以通过中的Mediameta类添加其他样式admin.py。在这里查看示例:
class MyModelAdmin(admin.ModelAdmin):
    class Media:
        js = ('js/admin/my_own_admin.js',)    
        css = {
             'all': ('css/admin/my_own_admin.css',)
        }

实际上,它不是模型级别,而是整个站点本身。要对base.css,ie.css等进行特定更改。一种选择是在应用程序本身中包含admin / base.html,并在admin / base.html文件中使用我的自定义base.css。这样,我将不得不从django admin到我自己的站点中包含一些模板文件。有没有比这更好的解决方案了?
rajan sthapit 2011年

我不知道。django管理员最终只能是django可重用应用程序。这也是与其他任何可重用应用程序一起使用的方式。
Torsten Engelbrecht

我注意到这里的js中列出了一个.css文件...这实际上有效吗?我无法理解。
fastmultiplication 2012年

你是对的。我犯了一个错误,并用Django文档中的示例编辑了答案。
Torsten Engelbrecht 2012年

用Eli Porter的话来说,“您烤了最好的猫”。
罗布·夸索夫斯基

32
  • 在中settings.py,请确保您的应用已在管理员之前列出INSTALLED_APPS
  • 创建(your-app)/templates/admin/base_site.html并将该<style>块放入{% block extrahead %}

例:

{% extends "admin/base_site.html" %}
{% block extrahead %}
    <style>
        .field-__str__ {
            font-family: Consolas, monospace;
        }
    </style>
{% endblock %}

6
最佳答案。如果需要,还可以通过在基础项目中放置“模板”目录并在settings.py中引用它来避免在INSTALLED_APPS中在管理员之前列出您的应用程序:TEMPLATES = [... ...其他东西... os.path.join(BASE_DIR,'templates')],]
RedPelle

很好的主意!像魅力一样顺畅地工作!
ozw1z5rd

29

我只是扩展了admin / base.html,以在其末尾包含对我自己的CSS文件的引用。CSS的优点在于您不必修改现有的定义,只需重新定义即可。


27

该解决方案将适用于管理站点,我认为这是最干净的方法,因为它会覆盖base_site.html升级django时不会更改的方法。

在模板目录admin中创建一个名为的文件夹,在其中创建一个名为的文件base_site.html

css名为的文件下的静态目录中创建admin-extra.css

在其中写下您想要的所有自定义CSS,例如:body{background: #000;}

将此粘贴到base_site.html

{% extends "admin/base.html" %}
{% load static from staticfiles %} # This might be just {% load static %} in your ENV

{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}

{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "css/admin-extra.css" %}" />{% endblock %}

{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>
{% endblock %}

{% block nav-global %}{% endblock %}

如评论中所述:确保您的应用位于INSTALLED_APPS中的管理应用之​​前,否则您的模板不会覆盖django的

而已!你完成了


4
谢谢,效果很好!如果它不起作用,请确保您的应用位于之前的admin应用之前INSTALLED_APPS,否则您的模板不会覆盖django的模板。
Dirbaio

1
最佳答案和评论。很难在管理页面上更改颜色。经过这个答案和评论确实巩固了它的工作原理。
Daniel Butler

1
您怎么知道base_site.html升级django不会改变?(我的意思是,这个答案已有3年历史了,并且仍然有效,但这不是保证书)
Marv

@marv,如果您在源代码中仔细查看,您会很容易看到,管理体系结构是围绕这些特定名称构建的,尤其是在URL和模板呈现中。继承继承类的类的类依赖于这些名称,除非对Django框架进行重大重新设计(即使这样,我也不会打赌会发生这种变化),将admin视图和admin URL覆盖的总体基本约定如下:以及根据django路线图,至少在接下来的3年中,覆盖基本模板将保持不变。
ELAD银

1
因此,这只是有关django的常识,没有任何具体资料可证实这一点?我不是在怀疑您,我只是想知道应该如何发现这种情况。
Marv

16

在您的静态目录中,创建一个static/admin/css/base.css文件。

首先粘贴Django的默认Admin CSS,然后在底部添加您的自定义设置。


8
如果这样做,请务必将您的应用django.contrib.admin放在列表中INSTALLED_APPS。如果不这样做,collectstatic将首先找到admin base.css,并且您的自定义版本不会覆盖它。
戴夫

3
这不是一个好的长期解决方案。它会复制/粘贴一堆代码,并且不会在Django升级时得到维护。
mlissner '17

Django管理员的任何样式基本上都是代码的一部分。Django的更新实际上可能破坏您的自定义。我的建议是将自定义项减至最少,并将其添加到Django默认样式的底部。然后,您可以根据需要手动更新默认样式。
Ryan Allen

@ danny-w-adair的答案更好;保持“干燥”状态,但这仍然是Django代码的分支,可能会导致轻微的升级麻烦。
Ryan Allen

10

如果您想要一个全局范围,并且不想考虑覆盖模板,那么mixin确实可以很好地工作。将此代码放在您想要的任何地方:

class CSSAdminMixin(object):
    class Media:
        css = {
            'all': ('css/admin.css',),
        }

然后,admin.css使用覆盖来制作一个名为的CSS文件,例如:

select[multiple] {
    resize: vertical;
}

然后,在所需的任何模型中,执行以下操作:

class MyModelAdmin(admin.ModelAdmin, CSSAdminMixin):

然后您会准备就绪。


我喜欢您的回答,但为什么不直接添加到MyModelAdmin
Goran

1
如果是一个模型,则可以执行此操作,但是如果对多个模型执行此操作,则会变得混乱。
mlissner

4

在中有admin/css/changelists.css一个文件夹STATICFILES_DIRS,它将使用户使用changelists.css而不是默认的admin。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.