Anular el css de administración en django

Respuestas:

110

Depende mucho de lo que quieras hacer. Aunque antes que nada: no lo sobrescriba directamente en el administrador de Django. Tienes dos opciones que creo que son razonables:

  1. Si desea cambiar la apariencia del administrador en general, debe anular las plantillas de administrador. Esto se cubre en detalles aquí: Anulación de plantillas de administración . A veces, puede simplemente extender el archivo de administración original y luego sobrescribir un bloque como {% block extrastyle %}{% endblock %}en django/contrib/admin/templates/admin/base.htmlun ejemplo.
  2. Si su estilo es específico del modelo, puede agregar estilos adicionales a través de la Mediametaclase en su admin.py. Vea un ejemplo aquí:
class MyModelAdmin(admin.ModelAdmin):
    class Media:
        js = ('js/admin/my_own_admin.js',)    
        css = {
             'all': ('css/admin/my_own_admin.css',)
        }
Torsten Engelbrecht
fuente
En realidad, no se trata de un modelo, sino de todo el sitio. Para ser cambios específicos en base.css, ie.css, etc. Una opción es incluir admin / base.html en mi aplicación y usar mi base.css personalizado en el archivo admin / base.html. De esa forma, tendré que incluir algunos archivos de plantilla del administrador de django en mi propio sitio. ¿Existe alguna solución mejor que esta?
rajan sthapit
Ninguno que yo sepa. El administrador de django no es más que una aplicación reutilizable de django. Ese es el camino a seguir con cualquier otra aplicación reutilizable.
Torsten Engelbrecht
Noto que hay un archivo .css listado dentro del js aquí ... ¿eso realmente funciona? No puedo hacerlo.
fastmultiplication
Sí, tiene usted razón. Cometí un error y edité mi respuesta con un ejemplo de los documentos de django.
Torsten Engelbrecht
En palabras de Eli Porter, "Asaste al mejor gato a la parrilla".
Rob Kwasowski
32
  • En settings.py, asegúrese de que su aplicación aparezca antes que admin en el archivo INSTALLED_APPS.
  • Cree (your-app)/templates/admin/base_site.htmly coloque el <style>bloque en el{% block extrahead %}

Ejemplo:

{% extends "admin/base_site.html" %}
{% block extrahead %}
    <style>
        .field-__str__ {
            font-family: Consolas, monospace;
        }
    </style>
{% endblock %}
tivnet
fuente
6
La mejor respuesta. Si lo desea, también puede evitar enumerar su aplicación antes que el administrador en INSTALLED_APPS colocando un directorio de "plantilla" en el proyecto base y haciendo referencia a él en settings.py: TEMPLATES = [... other stuffs ..., 'DIRS': [ os.path.join (BASE_DIR, 'templates')],]
RedPelle
¡Gran idea! ¡Funciona sin problemas como un encanto!
ozw1z5rd
29

Acabo de extender admin / base.html para incluir una referencia a mi propio archivo css, al final. La belleza de CSS es que no tiene que tocar las definiciones existentes, simplemente redefinir.

Danny W. Adair
fuente
27

Esta solución funcionará para el sitio de administración, creo que es la forma más limpia porque anula base_site.htmllo que no cambia al actualizar django.

Cree en su directorio de plantillas una carpeta llamada adminen ella cree un archivo llamado base_site.html.

Cree en su directorio estático en cssun archivo llamado admin-extra.css.

Escribe en él todas css la costumbre que desea para sus formas, como: body{background: #000;}.

Pega esto en 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 %}

Como se menciona en los comentarios: asegúrese de que su aplicación esté antes de la aplicación de administración en INSTALLED_APPS; de lo contrario, su plantilla no anula la de django

¡Eso es! ya terminaste

elad plata
fuente
4
¡Gracias, funciona muy bien! Si no funciona, asegúrese de que su aplicación esté antes de la aplicación de administración INSTALLED_APPS, de lo contrario, su plantilla no anula la de django.
Dirbaio
1
Mejor respuesta y comentario. Es sorprendentemente difícil cambiar el color de la página de administración. Revisar esta respuesta y comentario solidificó cómo funciona.
Daniel Butler
1
¿Cómo sabe que base_site.htmleso nunca cambiará al actualizar django? (Quiero decir, sí, esta respuesta tiene 3 años y todavía funciona, pero eso no está garantizado)
Marv
@marv, si mira bajo el capó en el código fuente, puede ver muy fácilmente que la arquitectura de administración se basa en estos nombres específicos, especialmente en las URL y la representación de la plantilla. las clases que heredan clases que heredan clases dependen de que estos nombres permanezcan iguales a menos que haya un rediseño importante del marco de Django (e incluso entonces no apostaría a que esto cambie) la convención básica general de anular las vistas de administrador y las URL de administrador como así como anular la plantilla base permanecerá igual durante los próximos 3 años al menos de acuerdo con la hoja de ruta de django.
elad silver
1
¿Entonces esto es solo conocimiento general sobre django y no hay una fuente concreta que lo confirme? No es que dude de ti, solo me pregunto cómo se supone que uno puede descubrir que este es el caso.
Marv
16

En su directorio estático, cree un static/admin/css/base.cssarchivo.

Pegue primero el CSS de administrador predeterminado de Django , luego agregue sus personalizaciones en la parte inferior.

Ryan Allen
fuente
8
Si hace esto, asegúrese de poner su aplicación ANTES django.contrib.adminen la lista de INSTALLED_APPS. Si no lo hace, collectstatic encontrará primero el archivo admin base.css y su versión personalizada no lo sobrescribirá.
Dave
3
Ésta no es una buena solución a largo plazo. Copia / pega un montón de código y no se mantendrá a medida que se actualice Django.
mlissner
Cualquier estilo para el administrador de Django es básicamente una bifurcación del código. Una actualización de Django podría, de hecho, romper sus personalizaciones. Mi recomendación es mantener las personalizaciones al mínimo y agregarlas al final del estilo predeterminado de Django. Luego, puede actualizar manualmente el estilo predeterminado cuando lo desee.
Ryan Allen
La respuesta anterior de @ danny-w-adair es mejor; mantiene las cosas "SECAS", pero sigue siendo una bifurcación del código de Django que podría provocar pequeños problemas de actualización.
Ryan Allen
10

Si desea un alcance global y no quiere pensar en anular plantillas, un mixin funciona muy bien para esto. Pon este código donde quieras:

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

Luego, cree un archivo CSS llamado admin.csscon sus anulaciones, por ejemplo:

select[multiple] {
    resize: vertical;
}

Luego, en los modelos que desee, haga:

class MyModelAdmin(admin.ModelAdmin, CSSAdminMixin):

Y estará todo listo.

mlissner
fuente
Me gusta su respuesta, pero ¿por qué no agregar directamente a MyModelAdmin?
Goran
1
Podrías hacer eso si es un modelo, pero se complicará si lo haces con muchos modelos.
mlissner
4

Tenga admin/css/changelists.cssdentro una carpeta adentro STATICFILES_DIRS, y usará ese changelists.css en lugar del administrador predeterminado.

Timothy Makobu
fuente