Переопределение административного css в django

84

Я хочу изменить определенный css в админке django, например base.css. Лучше менять прямо в библиотеке django? Как я могу отменить это наилучшим образом?

раджан стхапит
источник
Возможно, Grappelli избавит вас от хлопот ... grappelliproject.com Старый и устаревший ... lincolnloop.com/blog/…
Джон Ми

Ответы:

111

Это во многом зависит от того, чем вы хотите заниматься. Хотя прежде всего: не перезаписывайте его напрямую в админке Django. У вас есть два варианта, которые я считаю разумными:

  1. Если вы хотите изменить внешний вид администратора в целом, вам следует переопределить шаблоны администратора. Это подробно описано здесь: Переопределение шаблонов администратора . Иногда вы можете просто расширить исходный файл администратора, а затем перезаписать блок, как {% block extrastyle %}{% endblock %}в django/contrib/admin/templates/admin/base.htmlпримере.
  2. Если ваш стиль зависит от модели, вы можете добавить дополнительные стили через Mediaмета-класс в вашем 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, т.е. css и т. Д. Один из вариантов - включить admin / base.html в само приложение и использовать мой собственный base.css в файле admin / base.html. Таким образом, мне придется включить некоторые файлы шаблонов от администратора django на мой собственный сайт. Есть ли лучшее решение, чем это?
раджан стхапит
Мне ничего неизвестно. Администратор django - это не что иное, как многоразовое приложение django. То же самое и с любым другим многоразовым приложением.
Торстен Энгельбрехт
Я заметил, что здесь в js указан файл .css ... это действительно работает? Я не могу этого понять.
fastmultiplication
Да ты прав. Я допустил ошибку и отредактировал свой ответ примером из документации django.
Torsten Engelbrecht
По словам Эли Портера, «ты зажарил лучшего кота».
Роб Квасовски
33
  • В 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
Лучший ответ. Если вы хотите, вы также можете не указывать свое приложение перед администратором в INSTALLED_APPS, поместив каталог «шаблон» в базовый проект и указав его в settings.py: TEMPLATES = [... другие материалы ..., 'DIRS': [ os.path.join (BASE_DIR, 'templates')],]
RedPelle
Отличная идея! Работает плавно, как шарм!
ozw1z5rd 02
29

Я просто расширил admin / base.html, включив ссылку на мой собственный файл css - в конце. Прелесть css в том, что вам не нужно касаться существующих определений, просто заново определите.

Дэнни В. Адэр
источник
28

Это решение будет работать для сайта администратора, я думаю, что это самый чистый способ, потому что он переопределяет 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

Это оно! ты закончил

Elad Silver
источник
4
Спасибо, отлично работает! Если это не сработает, убедитесь, что ваше приложение находится перед приложением администратора INSTALLED_APPS, иначе ваш шаблон не переопределяет шаблон django.
Дирбайо,
1
Лучший ответ и комментарий. На админке поменять раскраску на удивление сложно. Этот ответ и комментарий помогли понять, как это работает.
Дэниел Батлер,
1
Откуда вы знаете, что base_site.htmlэто никогда не изменится при обновлении django? (Я имею в виду, что да, этому ответу 3 года, и он все еще работает, но это не гарант)
Marv
@marv, если вы заглянете под капот в исходный код, вы легко увидите, что архитектура администратора построена вокруг этих конкретных имен, особенно в URL-адресах и рендеринге шаблонов. классы, которые наследуют классы, которые наследуют классы, полагаются на то, что эти имена останутся такими же, если только не произойдет серьезная переработка инфраструктуры Django (и даже тогда я бы не стал делать ставку на это изменение) общего базового соглашения о переопределении просмотров администратора и URL-адресов администратора как ну а переопределение базового шаблона останется неизменным в течение следующих 3 лет, по крайней мере, согласно дорожной карте django.
elad silver
1
Так это всего лишь общие сведения о django, и нет конкретного источника, подтверждающего это? Это не значит, что я сомневаюсь в тебе, мне просто интересно, как можно узнать, что это так.
Marv
17

В своем статическом каталоге создайте static/admin/css/base.cssфайл.

Сначала вставьте стандартный CSS-код администратора Django , а затем добавьте свои настройки внизу.

Райан Аллен
источник
8
Если вы это сделаете, обязательно поместите свое приложение ПРЕЖДЕ django.contrib.adminв список INSTALLED_APPS. Если вы этого не сделаете, collectstatic сначала найдет admin base.css, и ваша настроенная версия не перезапишет его.
Дэйв
3
Это не лучшее долгосрочное решение. Он копирует / вставляет кучу кода, и он не будет поддерживаться при обновлении Django.
mlissner
Любой стиль для администратора Django - это, по сути, вилка кода. Фактически, обновление Django может нарушить ваши настройки. Я рекомендую свести настройки к минимуму и добавить их в нижней части стиля Django по умолчанию. Затем вы можете вручную обновить стиль по умолчанию, если и когда захотите.
Райан Аллен
Ответ @danny-w-adair выше лучше; сохраняет вещи «СУХИМИ», но это по-прежнему форк кода Django, который может вызвать незначительные проблемы с обновлением.
Райан Аллен
10

Если вам нужна глобальная область видимости и вы не хотите думать о переопределении шаблонов, для этого очень хорошо подходит миксин. Поместите этот код где хотите:

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

Затем создайте файл CSS admin.cssс вашими переопределениями, например:

select[multiple] {
    resize: vertical;
}

Затем в любых моделях выполните:

class MyModelAdmin(admin.ModelAdmin, CSSAdminMixin):

И все будет готово.

Млисснер
источник
Мне нравится ваш ответ, но почему бы не добавить прямо в MyModelAdmin
Горан
1
Вы могли бы сделать это, если это одна модель, но это будет беспорядочно, если вы сделаете это для многих моделей.
mlissner
4

Имейте admin/css/changelists.cssвнутри папку STATICFILES_DIRS, и он будет использовать этот файл changelists.css вместо административного по умолчанию.

Тимоти Макобу
источник