Jak nadpisać szablon administratora (np. Admin / index.html), jednocześnie go rozszerzając (patrz https://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-vs-replacing -an-admin-template )?
Po pierwsze - wiem, że to pytanie zostało już zadane i udzielono na nie odpowiedzi (zobacz Django: Przesłanianie ORAZ rozszerzanie szablonu aplikacji ), ale jak mówi odpowiedź, nie ma to bezpośredniego zastosowania, jeśli używasz modułu ładującego szablony app_directories (który jest większością czas).
Moje obecne obejście polega na tworzeniu kopii i rozszerzaniu ich zawartości zamiast rozszerzania bezpośrednio z szablonów administratora. Działa to świetnie, ale jest naprawdę mylące i wymaga dodatkowej pracy, gdy zmieniają się szablony administratora.
Może wymyślić jakiś niestandardowy tag rozszerzenia dla szablonów, ale nie chcę wymyślać koła na nowo, jeśli istnieje już rozwiązanie.
Na marginesie: czy ktoś wie, czy ten problem zostanie rozwiązany przez samo Django?
źródło
Odpowiedzi:
Aktualizacja :
Przeczytaj dokumentację swojej wersji Django. na przykład
https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#admin-overriding-templates https://docs.djangoproject.com/en/2.0/ref/contrib/admin/#admin-overriding -szablony
Oryginalna odpowiedź z 2011 r .:
Miałem ten sam problem około półtora roku temu i znalazłem na djangosnippets.org niezły program ładujący szablony, który to ułatwia. Pozwala na rozszerzenie szablonu w określonej aplikacji, dając możliwość tworzenia własnego admin / index.html, który rozszerza szablon admin / index.html z aplikacji administratora. Lubię to:
Podałem pełny przykład, jak używać tego modułu ładującego szablony w poście na moim blogu .
źródło
django-apptemplates
jeśli pewnego dnia przestanie działać.Ponieważ Django 1.8 jest obecną wersją, nie ma potrzeby tworzenia linków symbolicznych, kopiowania admin / templates do folderu projektu lub instalowania oprogramowania pośredniego, jak sugerują powyższe odpowiedzi. Oto co należy zrobić:
utwórz następującą strukturę drzewa (zalecane przez oficjalną dokumentację )
Uwaga : lokalizacja tego pliku nie jest ważna. Możesz umieścić go w swojej aplikacji i nadal będzie działać. O ile django może odkryć jego lokalizację. Co ważniejsze, nazwa pliku HTML musi być taka sama, jak oryginalna nazwa pliku HTML dostarczona przez django.
Dodaj tę ścieżkę szablonu do swojego settings.py :
Zidentyfikuj nazwę i blok, który chcesz zastąpić. Odbywa się to poprzez zaglądanie do katalogu admin / templates django. Używam virtualenv, więc dla mnie ścieżka jest tutaj:
W tym przykładzie chcę zmodyfikować formularz dodawania nowego użytkownika. Szablon responsiblve dla tego widoku to change_form.html . Otwórz change_form.html i znajdź {% block%}, który chcesz rozszerzyć.
W swoim change_form.html napisz coś takiego:
Załaduj swoją stronę i powinieneś zobaczyć zmiany
źródło
../
ścieżek „exetends” i określenie bardziej unikalnej ścieżki oryginalnej{% extends "../../admin/templates/admin/index.html" %}
. link do odpowiedzijeśli chcesz nadpisać
admin/index.html
, możesz ustawić parametr index_template plikuAdminSite
.na przykład
i umieść szablon w
<appname>/templates/admin/my_custom_index.html
źródło
{% extends "admin/index.html" %}
z my_custom_index.html i odwołać się do szablonu administratora django bez kopiowania go. Dziękuję Ci.Za pomocą
django
(przynajmniej) 1.5 możesz zdefiniować szablon, którego chcesz użyć dla konkretnegomodeladmin
zobacz https://docs.djangoproject.com/en/1.5/ref/contrib/admin/#custom-template-options
Możesz zrobić coś takiego
Z
change_form.html
bycia prosty szablon html rozszerzenieadmin/change_form.html
(lub nie, jeśli chcesz to zrobić od podstaw)źródło
Odpowiedź Chengsa jest poprawna, jednak zgodnie z dokumentacją administracyjną nie każdy szablon administratora można nadpisać w ten sposób: https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#overriding-admin-templates
Musiałem nadpisać login.html administratora i dlatego musiałem umieścić nadpisany szablon w tej strukturze folderów:
(bez podfolderu myapp w panelu administracyjnym) Nie mam wystarczającej reputacji, aby komentować post Chenga, dlatego musiałem napisać to jako nową odpowiedź.
źródło
Najlepszym sposobem na to jest umieszczenie szablonów administratora Django wewnątrz projektu. Więc twoje szablony będą dostępne,
templates/admin
podczas gdy standardowe szablony administracyjne Django będą na przykładtemplate/django_admin
. Następnie możesz wykonać następujące czynności:szablony / admin / change_form.html
Jeśli martwisz się o aktualizowanie szablonów magazynowych, możesz dołączyć je do zewnętrznych elementów svn lub podobnych.
źródło
--ignore
argumentu zmakemessages
. Zobacz: docs.djangoproject.com/en/dev/ref/django-admin/#makemessagesNie mogłem znaleźć ani jednej odpowiedzi ani sekcji w oficjalnych dokumentach Django, które zawierałyby wszystkie informacje potrzebne do zastąpienia / rozszerzenia domyślnych szablonów administratora, więc piszę tę odpowiedź jako kompletny przewodnik, mając nadzieję, że będzie to pomocne dla innych w przyszłości.
Zakładając standardową strukturę projektu Django:
Oto, co musisz zrobić:
W programie
mysite/admin.py
utwórz podklasęAdminSite
:Upewnij się, że import
custom_admin_site
wadmin.py
swoich aplikacjach i zarejestrować swoje modele na nim, aby wyświetlić je na swojej niestandardowej stronie administratora (jeśli chcesz).W programie
mysite/apps.py
utwórz podklasęAdminConfig
i ustawdefault_site
naadmin.CustomAdminSite
z poprzedniego kroku:W
mysite/settings.py
wymienićdjango.admin.site
wINSTALLED_APPS
przyapps.CustomAdminConfig
(niestandardowego administratora app config z poprzedniego etapu).W
mysite/urls.py
, zamieńadmin.site.urls
adres URL administratora nacustom_admin_site.urls
Utwórz szablon, który chcesz zmodyfikować w swoim
templates
katalogu, zachowując domyślną strukturę katalogów szablonów administratora Django, jak określono w dokumentacji . Na przykład, jeśli modyfikowałeśadmin/index.html
, utwórz pliktemplates/admin/index.html
.W ten sposób można modyfikować wszystkie istniejące szablony, a ich nazwy i struktury można znaleźć w kodzie źródłowym Django .
Teraz możesz albo nadpisać szablon, pisząc go od zera, albo rozszerzyć go, a następnie nadpisać / rozszerzyć określone bloki.
Na przykład, jeśli chcesz zachować wszystko tak, jak jest, ale chcesz przesłonić
content
blok (który na stronie indeksu zawiera listę zarejestrowanych aplikacji i ich modeli), dodaj dotemplates/admin/index.html
:Aby zachować oryginalną zawartość bloku, dodaj w
{{ block.super }}
dowolnym miejscu, w którym ma być wyświetlana oryginalna zawartość:Możesz także dodać własne style i skrypty, modyfikując bloki
extrastyle
iextrahead
.źródło
Zgadzam się z Chrisem Prattem. Ale myślę, że lepiej jest utworzyć dowiązanie symboliczne do oryginalnego folderu Django, w którym szablony administratora są umieszczane w:
i jak widać, zależy to od wersji Pythona i folderu, w którym zainstalowano Django. Dlatego w przyszłości lub na serwerze produkcyjnym może być konieczna zmiana ścieżki.
źródło
Ta strona miała proste rozwiązanie, które działało z moją konfiguracją Django 1.7.
PO PIERWSZE: Utwórz dowiązanie symboliczne o nazwie admin_src w katalogu / szablonie projektu do zainstalowanych szablonów Django. Dla mnie na Dreamhost przy użyciu virtualenv moje „źródłowe” szablony administracyjne Django były w:
PO DRUGIE: Utwórz katalog administratora w szablonach /
Więc szablon / katalog mojego projektu wyglądał teraz następująco:
TRZECIE: W swoim nowym katalogu / admin / stwórz plik base.html z następującą zawartością:
CZWARTE: Dodaj administratora favicon-admin.ico do statycznego folderu głównego img.
Gotowe. Łatwo.
źródło
dla indeksu aplikacji dodaj tę linię do jakiegoś wspólnego pliku py, takiego jak url.py
dla indeksu modułu aplikacji: dodaj tę linię do admin.py
dla listy zmian: dodaj tę linię do klasy administratora:
dla szablonu formularza modułu aplikacji: dodaj ten wiersz do klasy administratora
itp. i znajdź inne w tych samych klasach modułów administratora
źródło
Możesz użyć django-overextends , który zapewnia cykliczne dziedziczenie szablonów dla Django.
Pochodzi z Mezzanine CMS, skąd Stephen wyodrębnił go do samodzielnego rozszerzenia Django.
Więcej informacji można znaleźć w temacie „Szablony zastępujące a rozszerzające” (http: /mezzanine.jupo.org/docs/content-architecture.html#overriding-vs-extending-templates) w dokumentacji Mezzanine.
Bardziej szczegółowe informacje można znaleźć na blogu Stephens „Circular Template Inheritance for Django” (http: /blog.jupo.org/2012/05/17/circular-template-inheritance-for-django).
A w Grupach dyskusyjnych Google dyskusja (https: /groups.google.com/forum / #! Topic / mezzanine-users / sUydcf_IZkQ), która zapoczątkowała rozwój tej funkcji.
Uwaga:
Nie mam reputacji, aby dodać więcej niż 2 linki. Myślę jednak, że linki zawierają interesujące informacje ogólne. Pominąłem więc ukośnik po „http (s):”. Może ktoś o lepszej reputacji może naprawić linki i usunąć tę notatkę.
źródło