Zastąpienie css administratora w django

Odpowiedzi:

111

Wiele zależy od tego, co chcesz zrobić. Ale przede wszystkim: nie nadpisuj go bezpośrednio w panelu administracyjnym Django. Masz dwie opcje, które uważam za rozsądne:

  1. Jeśli chcesz zmienić ogólny wygląd administratora, powinieneś zastąpić szablony administracyjne. Jest to szczegółowo omówione tutaj: Zastępowanie szablonów administracyjnych . Czasami można po prostu rozszerzyć oryginalnego pliku administratora, a następnie zastąpić blok jak {% block extrastyle %}{% endblock %}w django/contrib/admin/templates/admin/base.htmljako przykład.
  2. Jeśli Twój styl jest specyficzny dla modelu, możesz dodać dodatkowe style za pośrednictwem Mediameta klasy w pliku admin.py. Zobacz przykład tutaj:
class MyModelAdmin(admin.ModelAdmin):
    class Media:
        js = ('js/admin/my_own_admin.js',)    
        css = {
             'all': ('css/admin/my_own_admin.css',)
        }
Torsten Engelbrecht
źródło
Właściwie nie jest to poziom modelu, ale cała witryna. Mówiąc konkretnie o zmianach w base.css, tj. Css itp. Jedną z opcji jest włączenie admin / base.html do samej mojej aplikacji i użycie mojego niestandardowego base.css w pliku admin / base.html. W ten sposób będę musiał dołączyć kilka plików szablonów od administratora django do mojej własnej witryny. Czy jest jakieś lepsze rozwiązanie niż to?
rajan sthapit
Żaden, którego nie jestem świadomy. Administrator django to w końcu nic innego jak aplikacja django wielokrotnego użytku. Tak też jest w przypadku każdej innej aplikacji wielokrotnego użytku.
Torsten Engelbrecht
Zauważyłem, że w pliku js jest wymieniony plik .css ... czy to faktycznie działa? Nie mogę tego zrobić.
fastmultiplication
Tak masz rację. Popełniłem błąd i zredagowałem odpowiedź na przykładzie z dokumentacji django.
Torsten Engelbrecht,
Jak powiedział Eli Porter, „Ugotowałeś najlepszego kota na grillu”.
Rob Kwasowski
33
  • W programie settings.pyupewnij się, że Twoja aplikacja jest wymieniona przed administratorem w INSTALLED_APPS.
  • Utwórz (your-app)/templates/admin/base_site.htmli umieść <style>blok w{% block extrahead %}

Przykład:

{% extends "admin/base_site.html" %}
{% block extrahead %}
    <style>
        .field-__str__ {
            font-family: Consolas, monospace;
        }
    </style>
{% endblock %}
tivnet
źródło
6
Najlepsza odpowiedź. Jeśli chcesz, możesz również uniknąć umieszczania swojej aplikacji na liście przed administratorem w INSTALLED_APPS, umieszczając katalog "template" w projekcie podstawowym i odwołując się do niego w settings.py: TEMPLATES = [... other stuff ..., 'DIRS': [ os.path.join (BASE_DIR, 'templates')],]
RedPelle
Świetny pomysł! Działa płynnie jak urok!
ozw1z5rd
29

Po prostu rozszerzyłem admin / base.html, aby na końcu zawarł odniesienie do mojego własnego pliku css. Piękno CSS polega na tym, że nie musisz zmieniać istniejących definicji, wystarczy je ponownie zdefiniować.

Danny W. Adair
źródło
28

To rozwiązanie będzie działać na stronie administratora, myślę, że to najczystszy sposób, ponieważ zastępuje base_site.html co nie zmienia się podczas aktualizacji django.

Utwórz w katalogu szablonów folder o nazwie admin w nim, utwórz plik o nazwie base_site.html.

Utwórz w swoim katalogu statycznym pod css pliku o nazwie admin-extra.css.

Napisz w nim wszystkie niestandardowe css, które chcesz dla swoich formularzy, takie jak: body{background: #000;} .

Wklej to w 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 %}

Jak wspomniano w komentarzach: upewnij się, że twoja aplikacja znajduje się przed aplikacją administratora w INSTALLED_APPS, w przeciwnym razie twój szablon nie nadpisuje django

Otóż ​​to! Jesteś skończony

elad srebrny
źródło
4
Dzięki, działa świetnie! Jeśli to nie zadziała, upewnij się, że Twoja aplikacja znajduje się przed aplikacją administratora, w INSTALLED_APPSprzeciwnym razie Twój szablon nie zastąpi szablonu django.
Dirbaio,
1
Najlepsza odpowiedź i komentarz. Zaskakująco trudno jest zmienić kolorystykę na stronie administratora. Przeglądanie tej odpowiedzi i komentarza umocniło sposób, w jaki to działa.
Daniel Butler,
1
Skąd wiesz, że base_site.htmlto się nigdy nie zmieni po aktualizacji django? (To znaczy tak, ta odpowiedź ma 3 lata i nadal działa, ale to nie jest gwarancja)
Marv
@marv Jeśli spojrzysz pod maskę w kodzie źródłowym, możesz bardzo łatwo zobaczyć, że architektura administratora jest zbudowana wokół tych konkretnych nazw, szczególnie w adresach URL i renderowaniu szablonu. klasy, które dziedziczą klasy, które dziedziczą klasy, polegają na tym, że te nazwy pozostają takie same, chyba że nastąpi duże przeprojektowanie frameworka Django (i nawet wtedy nie postawiłbym na tę zmianę) ogólna podstawowa konwencja nadpisywania widoków administratora i adresów URL administratora, jak Zastąpienie szablonu podstawowego pozostanie niezmienione przez następne 3 lata, przynajmniej zgodnie z mapą drogową django.
elad silver
1
Czyli to tylko ogólna wiedza o django i nie ma konkretnego źródła, które to potwierdza? Nie chodzi o to, że wątpię w ciebie, po prostu zastanawiam się, jak można się dowiedzieć, że tak jest.
Marv
17

W katalogu statycznym utwórz static/admin/css/base.cssplik.

Wklej najpierw domyślny Admin CSS Django , a następnie dodaj swoje dostosowania na dole.

Ryan Allen
źródło
8
Jeśli to zrobisz, pamiętaj, aby umieścić swoją aplikację PRZED django.contrib.adminna liście INSTALLED_APPS. Jeśli tego nie zrobisz, collectstatic najpierw znajdzie plik admin base.css, a Twoja dostosowana wersja go nie zastąpi.
Dave,
3
To nie jest dobre długoterminowe rozwiązanie. Kopiuje / wkleja fragment kodu i nie będzie utrzymywany podczas aktualizacji Django.
mlissner
Każdy styl dla administratora Django jest w zasadzie rozwidleniem kodu. Aktualizacja Django może w efekcie zepsuć twoje dostosowania. Zalecam ograniczenie dostosowań do minimum i dodawanie ich u dołu domyślnego stylu Django. Następnie możesz ręcznie zaktualizować domyślny styl, jeśli i kiedy chcesz.
Ryan Allen
Odpowiedź @ danny-w-adair powyżej jest lepsza; utrzymuje rzeczy „SUCHE”, ale nadal jest to rozwidlenie kodu Django, które może prowadzić do drobnych problemów z aktualizacją.
Ryan Allen
10

Jeśli chcesz mieć zasięg globalny i nie chcesz myśleć o nadpisywaniu szablonów, mixin działa w tym przypadku naprawdę dobrze. Umieść ten kod w dowolnym miejscu:

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

Następnie utwórz plik CSS o nazwie admin.cssze swoimi przesłonięciami, na przykład:

select[multiple] {
    resize: vertical;
}

Następnie, w dowolnych modelach, zrób:

class MyModelAdmin(admin.ModelAdmin, CSSAdminMixin):

I wszystko będzie gotowe.

mlissner
źródło
Podoba mi się twoja odpowiedź, ale dlaczego nie dodać bezpośrednio do MyModelAdmin
Goran
1
Możesz to zrobić, jeśli jest to jeden model, ale zrobi się bałagan, jeśli zrobisz to dla wielu modeli.
mlissner
4

Miej admin/css/changelists.csswewnątrz folder w STATICFILES_DIRSi będzie to użytkownik changelists.css zamiast domyślnego administratora.

Timothy Makobu
źródło