Перевизначення адміністратора css у django


85

Я хочу змінити певний css в адмін-django, наприклад base.css. Чи краще змінювати безпосередньо в бібліотеці django? Як я можу замінити це найкращим чином?


Можливо, граппеллі врятує вас від клопоту ... 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 тощо. Одним із варіантів є включення адміністратора / base.html до самого мого додатку та використання мого власного base.css у файлі admin / base.html. Таким чином мені доведеться включити деякі файли шаблонів від адміністратора django на свій власний сайт. Чи є якесь краще рішення, ніж це?
rajan sthapit

Жодного я не знаю. Зрештою адміністратор django - це не що інше, як додаток для багаторазового використання django. Це шлях і з будь-яким іншим додатком для багаторазового використання.
Torsten Engelbrecht

Я помічаю, що тут є js-файл .css, перелічений тут ... чи це насправді працює? Не можу дістати.
швидке множення

Так, ти маєш рацію. Я помилився і відредагував свою відповідь на прикладі з django docs.
Торстен Енгельбрехт

За словами Елі Портера, "Ви приготували найкращого кота".
Роб Квасовський

34
  • В 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,

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

Це воно! ви закінчили


4
Дякую, чудово працює! Якщо це не спрацьовує, переконайтеся, що ваш додаток знаходиться перед додатком адміністратора INSTALLED_APPS, інакше ваш шаблон не замінить django.
Dirbaio

1
Найкраща відповідь та коментар. Змінити забарвлення на сторінці адміністратора напрочуд важко. Перегляд цієї відповіді та коментаря закріпив, як це працює.
Деніел Батлер

1
Звідки ви знаєте, що base_site.htmlніколи не зміниться під час оновлення django? (Я маю на увазі так, цій відповіді 3 роки і вона все ще працює, але це не гарантія)
Marv

@marv, якщо ви подивитесь на кришку у вихідному коді, ви можете дуже легко побачити, що архітектура адміністратора побудована навколо цих конкретних імен, особливо в URL-адресах та візуалізації шаблону. класи, які успадковують класи, які успадковують класи, покладаються на те, що ці імена залишаються незмінними, якщо не відбудеться серйозний редизайн фреймворка Django (і навіть тоді я б не робив ставку на це зміна) загальної базової конвенції про перевизначення подань адміністратора та URL-адрес адміністратора як а також заміщення базового шаблону залишатиметься незмінним протягом наступних 3 років принаймні згідно з дорожньою картою django.
elad silver 24.03.20

1
Отже, це лише загальні знання про джанго, і немає конкретного джерела, що підтверджує це? Справа не в тому, що я сумніваюся у вас, мені просто цікаво, як хтось повинен дізнатися, що це так.
Marv

17

У вашому статичному каталозі створіть static/admin/css/base.cssфайл.

Спочатку вставте стандартний адміністратор CSS для Django , а потім додайте свої налаштування внизу.


8
Якщо ви це зробите, обов’язково додайте програму ДО django.contrib.adminв список INSTALLED_APPS. Якщо ви цього не зробите, collestatic знайде спочатку адміністратор 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 замість адміністратора за замовчуванням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.