Dědičnost Django admin šablon

21 views
Skip to first unread message

MirekZv

unread,
Feb 10, 2021, 11:22:05 AM2/10/21
to django-cs
Django mi zas dává do těla.

Snažím se přidat menu do Django admina.
Ačkoli lze najít plno návodů, zdá se mi, že všechno jsou hrozné hacky a přestávají fungovat s nejbližší novější verzí Djanga.

Takže by se mi zdálo, že nejbezpečnější by bylo,
přidat si svoje vlastní menu položky před to, co generuje šablona admin/app_list.html.

Ta totiž generuje seznam aplikací (skupiny menu) a modelů v nich (položky skupin).
Tak bych si tam předhodil jednu skupinu se svými odkazy.
A fungovalo by to ve všech scénářích, kde se to volá, ať už je to hlavní obsah stránky, nebo to postranní menu (bavím se o Dj 3.1).

JENŽE:

Když předřadím svoji aplikaci před django.contrib.admin, udělám v ní také admin/app_list.html, tak běží ten můj přednostně a pokud je v něm {% extends 'admin/app_list.html' %}, tak volá následně tu originál djangovou a nahrazuje v ní bloky , které předefinuji.

To funguje a je to snad i popsáno v dokumentaci.
Jenže v té originál nejsou žádné bloky. Jsou líní to aspoň jedním blokem owrapovat,.aby šlo předchozí použít.

Ale když místo toho dám {% include 'admin/app_list.html' %},
tak nejde na tu djangovou originální, ale volá dokola stále tu moji (nekonečná rekurze).

Je nějaká možnost jak mít svoji templatu pod jménem app_list.html a volat z ní něco svého + ten originální obsah?

Aniž bych musel patchovat ten originální Django kód a jako kretén to upravovat pokaždé, když vyjde nová verze Djanga??

MirekZv

unread,
Feb 10, 2021, 11:26:29 AM2/10/21
to django-cs
PS: Potřeboval bych prostě buď umět includnout tu originální (ze stejnojmenné) nebo něco jako předefinovat {% block cela_originalni_sablona %} s voláním {{block.super}}.

Dne středa 10. února 2021 v 17:22:05 UTC+1 uživatel MirekZv napsal:

Honza Král

unread,
Feb 10, 2021, 11:29:32 AM2/10/21
to djan...@googlegroups.com
app_list.html neni urcena k pretezovani, proto na to neni zarizena. Nejjednodussi cesta je:

nastav si custom sablonu na index_template (0). Ve sablone (ktera se nebude jmenovat admin/index.html) extenduj index.html a prepis {% block content %} kde misto admin/app_list.html naimportujes jinou sablonu, ktera byde extendovat admin/app_list.html



Honza Král
E-Mail: honza...@gmail.com
Phone:  +420 606 678585


--
--
E-mailová skupina djan...@googlegroups.com
Správa: http://groups.google.cz/group/django-cs
---
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „django-cs“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu django-cs+...@googlegroups.com.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/django-cs/07164eea-9a91-4796-abd5-94eaabc3454bn%40googlegroups.com.

MirekZv

unread,
Feb 10, 2021, 12:10:44 PM2/10/21
to django-cs
Možná jsem Tě přesně nepochopil.
Já umím extendovat admin/app_list.html, jenže je mi to k..h..u, protože ta v sobě nemá žádný {% block .... %} - takže proč ji extendovat?
Ale možná jsi myslel includovat. To by dávalo smysl.

A pak taky nevím, jestli to, co píšeš, řeší, aby moje přidané položky byly všude: 1) Na hlavní stránce admina, 2) Na stránkách aplikací, 3) V sidebar menu během editace.



Dne středa 10. února 2021 v 17:29:32 UTC+1 uživatel honza...@gmail.com napsal:

MirekZv

unread,
Feb 10, 2021, 12:15:18 PM2/10/21
to django-cs
Mezitím mám jedno řešení.
Dokumentace Djanga je "doslovně" pravdivá: If you use {% extends %} in a template, it must be the first template tag in that template.
To skutečně znamená, že extends může předcházet (nikoli následovat) html kód.
To by mi celkem vyhovovalo. Jediné, co mě štve je, že nemůžu použít nejen {% include ... %}, ale ani i18n/trans :(
Příklad viz obrázky.rap1.pngrap2.png

Dne středa 10. února 2021 v 18:10:44 UTC+1 uživatel MirekZv napsal:

MirekZv

unread,
Feb 10, 2021, 12:45:24 PM2/10/21
to django-cs
PS:
Potíž je, že tím předchozím postupem nejen nelze i18n/trans, ale nelze ani vsadit do html jakýkoli string, který bych si připravil předem.
Leda můžu v template/base.py místo `raise self.error(token, '%r must be the first tag in the template.' % node,)` dát `pass`,
aby Django neprovádělo své přechytralé kontraproduktivní kontroly.
Jenže to už je zase patchování Djanga.
Ach jo, zlatej Cheetah.

Dne středa 10. února 2021 v 18:15:18 UTC+1 uživatel MirekZv napsal:
Message has been deleted

MirekZv

unread,
Feb 10, 2021, 1:40:26 PM2/10/21
to django-cs
Abych pořád jen nefňukal, že Weppy je polomrtvé a Cheetah opovrhovaný, ale abych skončil trochu konstruktivně:
V soutěži minimalizace zla se umístila tato řešení:

(1) menší flexibilita, menší náchylnost na problémy při upgradu Djanga
ve vlastní aplikaci: admin/index.html
```
{% extends "admin/index.html" %}
{% block content %}
<div id="content-main">
    {% include 'admin/before_app_list.html' %}{#mz#}
    {% include "admin/app_list.html" with app_list=app_list show_changelinks=True %}
</div>
{% endblock %}
```
ve vlastní aplikaci: admin/nav_sidebar.html
{% load i18n %}
<button class="sticky toggle-nav-sidebar" id="toggle-nav-sidebar" aria-label="{% translate 'Toggle navigation' %}"></button>
<nav class="sticky" id="nav-sidebar">
{% include 'admin/before_app_list.html' %}{#mz#}
{% include 'admin/app_list.html' with app_list=available_apps show_changelinks=False %}
</nav>

(2) větší flexibilita, větší náchylnost na problémy při upgradu Djanga
ve vlastní aplikaci: admin/app_list.html
nedědit/nepřetěžovat, ale upravit podle potřeby

Dne středa 10. února 2021 v 18:45:24 UTC+1 uživatel MirekZv napsal:

MirekZv

unread,
Feb 11, 2021, 4:38:05 AM2/11/21
to django-cs
PS: weppy ~ emmett ?

Dne středa 10. února 2021 v 19:40:26 UTC+1 uživatel MirekZv napsal:

MirekZv

unread,
Feb 11, 2021, 4:39:53 AM2/11/21
to django-cs
Ještě, kdyby to někdo taky potřeboval implementovat (přestože jsme se dozvěděli, že k tomu Django není určeno) přidám jedno vhodné řešení:
(3) použít django-baton.

Dne čtvrtek 11. února 2021 v 10:38:05 UTC+1 uživatel MirekZv napsal:

Pavel Cisar

unread,
Feb 12, 2021, 3:52:54 PM2/12/21
to djan...@googlegroups.com
Ahoj,
nemuzu si pomoct, ale pripada mi, ze jde spis o nepochopeni podstaty django admina. Je to skvely nastroj pro nahlizeni do struktury dat a dava moznost urcitych modifikaci, ale primarne pro vnitrni potrebu.
V dokumentaci v podstate pisou, ze pokud chce clovek neco vic a nevejde se danych mantinelu, je nacase si napsat vlastni interface a s tim musim rozhodne souhlasit.
Pokud clovek vyslovene nechce psat neco vlastniho a rad by zmenit vzhled nebo mel vice moznosti, tak bych ho odkazal na projekty jako:



pá 12. 2. 2021 v 16:42 odesílatel MirekZv <mirek....@gmail.com> napsal:
Honza zatím mlčí, odpovím si sám.
Samozřejmě, že admin/app_list.html se volá na 2 místech.
Jedno místo popisuje Honza - to je "vhodné k přetěžování".
Podruhé v nav_sidebar.html, tam opět žádný blok není, neboli další šablona, která "není určena k přetěžování".
Ostatně, kdykoli když slyším slovo "přetěžování", tak už je mi jasné, že je něco špatně.
Takže závěr: Django je jako vždy geniální, já jsem zase ten blbec, co ho chce použít k něčemu, k čemu není určeno.
(sorry za tu mírnou jedovatost, já to tak nemyslím, jen toho mám trochu plné zuby)
Dne středa 10. února 2021 v 18:45:24 UTC+1 uživatel MirekZv napsal:
PS:

Jan Bednařík

unread,
Feb 12, 2021, 4:54:42 PM2/12/21
to djan...@googlegroups.com
Ahoj,

s těmi mantinely se to má tak, že tam kde člověk narazí na limity rozumné customizace adminu, tak snadno přihodí vlastní view, template, formuláře, atp. A ten vlastní interface si dopíše do adminu. Což dává smysl, pokud se aspoň kus či většina adminu využije.

Na customizaci vzhledu se mi osvědčil https://github.com/fabiocaccamo/django-admin-interface který nedělá moc velkou magii a spíš to přestyluje jen barevně.

Honza

pá 12. 2. 2021 v 21:52 odesílatel Pavel Cisar <cisar...@gmail.com> napsal:

MirekZv

unread,
Feb 16, 2021, 8:26:27 AM2/16/21
to django-cs
@jan:
Díky za tip. Jasně, jen design, co je navíc, je od zlého, jak praví písmo svaté.
Asi už to nebude na pořadu dne, protože už snad ve 3.2 mají být v adminu Themes.
Dělal jsem na projektu, kde tam přidali něco složitějšího (teď mi vypadlo jméno), možná to v jisté fázi bylo dobré, ale autor to ani neopensourcoval, takže za 3 roky začaly problémy růst geometrickou řadou.
Bohužel si zákazník navykl na vzhled.
Takže když se z toho vycouvávalo, nepopulární, ale nutný krok, našli jsme django-baton. Ten dělá malinko víc než themes, ale opravdu malinko (zejména to konfigurovatelné menu), snažíme se to udržovat stylem proměnné v settings BATON=True/False a občas zkontrolovat, že to jede i pod plain nativním adminem. Tak snad nás to moc nevypráská.
Dne pátek 12. února 2021 v 22:54:42 UTC+1 uživatel jan.be...@gmail.com napsal:

MirekZv

unread,
Feb 16, 2021, 8:39:21 AM2/16/21
to django-cs
@cisar:
Já tomu rozumím a snad to i chápu jako přínosné.
Co by mi ale připadalo jako správné, dát to formou důrazného doporučení.
Použil sis to pro něco jiného než pro staff, tak se nediv, pokud jsi nedomyslel všechny konsekvence, byla to tvoje úvaha.
Ale natvrdo to zablokovat jen pro is_staff, znemožnit to samoúčelnou (jasně: oponent řekne že účelnou) validací, která není proto, aby se software nezhroutil nebo nedostal do nekonzistentního stavu, ale jen proto, aby vývojář, který má u zákazníka trochu jinou konfiguraci uživatelů než v redakci nějakého žurnálu, to nemohl použít, i když by to perfektně chodilo, mi přijde jako zvěrstvo.
Koncipovat menu tak, aby se nemohlo měnit (spíš tedy rozšiřovat) mi přijde jako zvěrstvo. [ono to tak v reálu snad není, snad to bylo jen v této diskuzi malinko neštastně řečeno]
Kromě toho, že by i sám vývojář mohl mít právo myslet, tak určitě ten zákazník, který do toho vleze, řekne: Prosím Tě, je to paráda, jen mi ještě do menu přidej tyto 2 volby, když už tady to menu je. A vy mu jako budete říkat (a budete za debila), že sice tomu tak úplně nerozumíte proč, ale určitě by to nebylo správné, protože chytří lidi rozhodli, že doplňovat další položky do menu je blbost?

Dne pátek 12. února 2021 v 21:52:54 UTC+1 uživatel cisar...@gmail.com napsal:
Reply all
Reply to author
Forward
0 new messages