Quiero cambiar ciertos css en admin django como base.css. ¿Es mejor cambiar directamente en la biblioteca de django? ¿Cómo puedo anularlo de la mejor manera?
Quiero cambiar ciertos css en admin django como base.css. ¿Es mejor cambiar directamente en la biblioteca de django? ¿Cómo puedo anularlo de la mejor manera?
Respuestas:
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:
{% block extrastyle %}{% endblock %}
en django/contrib/admin/templates/admin/base.html
un ejemplo.Media
metaclase 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',)
}
settings.py
, asegúrese de que su aplicación aparezca antes que admin en el archivo INSTALLED_APPS
.(your-app)/templates/admin/base_site.html
y 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 %}
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.
Esta solución funcionará para el sitio de administración, creo que es la forma más limpia porque anula base_site.html
lo que no cambia al actualizar django.
Cree en su directorio de plantillas una carpeta llamada admin
en ella cree un archivo llamado base_site.html
.
Cree en su directorio estático en css
un 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
INSTALLED_APPS
, de lo contrario, su plantilla no anula la de django.
base_site.html
eso nunca cambiará al actualizar django? (Quiero decir, sí, esta respuesta tiene 3 años y todavía funciona, pero eso no está garantizado)
En su directorio estático, cree un static/admin/css/base.css
archivo.
Pegue primero el CSS de administrador predeterminado de Django , luego agregue sus personalizaciones en la parte inferior.
django.contrib.admin
en 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á.
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.css
con sus anulaciones, por ejemplo:
select[multiple] {
resize: vertical;
}
Luego, en los modelos que desee, haga:
class MyModelAdmin(admin.ModelAdmin, CSSAdminMixin):
Y estará todo listo.
Tenga admin/css/changelists.css
dentro una carpeta adentro STATICFILES_DIRS
, y usará ese changelists.css en lugar del administrador predeterminado.