Chcę użyć tego samego {% block%} dwa razy w tym samym szablonie django. Chcę, aby ten blok pojawiał się więcej niż raz w moim szablonie podstawowym:
# base.html
<html>
<head>
<title>{% block title %}My Cool Website{% endblock %}</title>
</head>
<body>
<h1>{% block title %}My Cool Website{% endblock %}</h1>
</body>
</html>
A potem przedłużyć:
# blog.html
{% extends 'base.html' %}
{% block title %}My Blog{% endblock %}
# pictures.html
{% extends 'base.html' %}
{% block title %}My Pictures{% endblock %}
# cats.html
{% extends 'base.html' %}
{% block title %}My Cats{% endblock %}
Dostanę wyjątek, ponieważ Django chce, aby blok pojawił się tylko raz:
TemplateSyntaxError w /
Znacznik „blok” z nazwą „tytuł” pojawia się więcej niż raz
Szybki i brudny rozwiązaniem byłoby powielenie bloku tytuł do Title1 i Title2 :
# blog.html
{% extends 'base.html' %}
{% block title1 %}My Blog{% endblock %}
{% block title2 %}My Blog{% endblock %}
Ale jest to naruszenie zasady DRY . Byłoby to bardzo trudne, ponieważ mam wiele dziedziczących szablonów, a także dlatego, że nie chcę iść do diabła ;-)
Czy jest jakaś sztuczka lub obejście tego problemu? Jak mogę powtórzyć ten sam blok w moim szablonie bez powielania całego kodu?
django
django-templates
dry
David Arcos
źródło
źródło
Odpowiedzi:
Myślę, że użycie procesora kontekstu jest w tym przypadku przesadą. Możesz to łatwo zrobić:
i wtedy:
i tak dalej ... Wygląda na kompatybilny z DRY.
źródło
h1
zawartość wewnątrz bloku, który definiujetitle
. Lub blokiem, który definiuje część z poniższychtitle
.Użyj wtyczki makr szablonów Django:
https://gist.github.com/1715202 (django> = 1.4)
lub
http://www.djangosnippets.org/snippets/363/ (django <1.4)
django> = 1.4
i
django <1.4
i
źródło
Prawdopodobnie nie chcesz używać bloku, ale raczej po prostu użyć zmiennej:
Następnie ustawia się tytuł poprzez kontekst.
źródło
Oto sposób, który odkryłem, próbując zrobić to samo:
Wymaga niestety dodatkowego pliku, ale nie wymaga podania tytułu z widoku.
źródło
<tr>
kłótnia była dość złożona.możesz użyć
{% include subtemplate.html %}
więcej niż raz. to nie to samo, co bloki, ale załatwia sprawę.źródło
include
jest wolniejszy niżblock
. docs.djangoproject.com/en/1.10/topics/performance/…Tutaj jest dyskusja: http://code.djangoproject.com/ticket/4529 Oczywiście główny zespół django odrzuca to zgłoszenie, ponieważ uważają, że nie jest to często używany scenariusz, jednak się z tym nie zgadzam.
Powtarzaj blok to prosta i czysta implementacja: https://github.com/SmileyChris/django-repeatblock
makra szablonów to kolejne, jednak autor wspomniał, że nie zostały one dokładnie przetestowane: http://www.djangosnippets.org/snippets/363/
Użyłem powtarzającego się bloku.
źródło
Jako aktualizacja dla każdego, kto zetknie się z tym, wziąłem wspomniany powyżej fragment i przekształciłem go w bibliotekę tagów szablonów, django-macros, dzięki czemu makra są potężniejsze, a także jawnie implementuje powtarzający się wzorzec blokowy: django-macros .
źródło
Oto lekkie rozwiązanie podobne do powyższego
do_set
ido_get
odpowiedź tagu szablonu. Django umożliwia przekazanie całego kontekstu szablonu do znacznika, który umożliwia zdefiniowanie zmiennej globalnej.base.html:
page.html:
tag niestandardowy (pomysł tutaj: https://stackoverflow.com/a/33564990/2747924 ):
Nie zapomnij również o
{% load %}
swoich niestandardowych tagach lub dodaj je do listy wbudowanych opcji szablonów, aby nie trzeba było ich ładować w każdym szablonie. Jedynym ograniczeniem tego podejścia jest to, że{% define %}
musi być wywoływane z poziomu tagu bloku, ponieważ szablony potomne renderują tylko tagi bloków, które pasują do tagów nadrzędnych. Nie jestem pewien, czy jest na to sposób. Upewnij się również, żedefine
połączenie nadeszło, zanim spróbujesz go oczywiście użyć.źródło
Opierając się na sugestii Van Gale'a, możesz utworzyć tagi pobierania i ustawiania, dodając następujące elementy do pliku templatetags.py:
Następnie ustaw wartości w jednym szablonie za pośrednictwem
{% set foo %}put data here{% endset %}
i pobierz je{% get foo %}
w innym.źródło
Ja także natknąłem się na tę samą potrzebę powtórzenia {% block%} w moich plikach szablonów. Problem polega na tym, że chcę, aby Django {% block%} był używany w każdym przypadku warunku Django i chcę, aby {% block%} był nadpisywalny przez kolejne pliki, które mogą rozszerzyć bieżący plik. (Więc w tym przypadku to, czego chcę, to zdecydowanie bardziej blok niż zmienna, ponieważ technicznie nie używam jej ponownie, po prostu pojawia się na każdym końcu warunku.
Problem:
Poniższy kod szablonu Django spowoduje błąd składni szablonu, ale myślę, że jest to poprawne "pragnienie" ponownego użycia zdefiniowanego {% block%} warunkowego (IE, dlaczego składnia sprawdzania poprawności parsera Django jest na OBU końcach warunkowej, czy nie powinien on jedynie potwierdzać warunku PRAWDA?)
Rozwiązanie:
Możesz użyć {% include%}, aby warunkowo wstawić {% block%} więcej niż raz. To zadziałało dla mnie, ponieważ moduł sprawdzania składni Django zawiera tylko PRAWDA {% zawiera%}. Zobacz wynik poniżej:
źródło
Używam tej odpowiedzi, aby wszystko było suche.
źródło
Są na to dwa proste rozwiązania.
Najłatwiej jest umieścić tytuł w zmiennej kontekstowej. Możesz ustawić zmienną kontekstową w swoim widoku.
Jeśli używasz czegoś takiego jak widoki ogólne i nie masz pliku views.py dla zdjęć, kotów itp., Możesz przejść drogą niestandardowego tagu szablonu, który ustawia zmienną w kontekście .
Wybranie tej trasy pozwoliłoby ci zrobić coś takiego:
Następnie w swoim base.html:
źródło
Any variable set in the context will only be available in the same block of the template in which it was assigned. This behavior is intentional; it provides a scope for variables so that they don’t conflict with context in other blocks.
Wybrana odpowiedź nawiązuje do łatwego obejścia polegającego na umieszczeniu jednego tagu wewnątrz drugiego w szablonie podrzędnym, aby nadać im tę samą wartość. Używam tego do takich zdjęć społecznościowych.
Szablon podrzędny:
Następnie u rodzica
base.html
:źródło
W gałązce możesz zrobić to tak:
źródło