Chciałbym zapewnić tę samą zawartość w 2 różnych plikach podstawowych.
Więc próbuję to zrobić:
page1.html:
{% extends "base1.html" %}
{% include "commondata.html" %}
page2.html:
{% extends "base2.html" %}
{% include "commondata.html" %}
Problem polega na tym, że nie mogę używać zarówno rozszerzeń, jak i dołączania. Czy jest jakiś sposób, aby to zrobić? A jeśli nie, jak mogę to osiągnąć?
commondata.html zastępuje blok określony zarówno w base1.html, jak i base2.html
Ma to na celu udostępnienie tej samej strony w formacie pdf i html, gdzie formatowanie jest nieco inne. Powyższe pytanie upraszcza jednak to, co próbuję zrobić, więc jeśli mogę uzyskać odpowiedź, że rozwiąże to mój problem.
źródło
Z dokumentów Django:
Więc Django nie pobiera żadnych bloków z twojego commondata.html i nie wie, co zrobić z wyrenderowanymi blokami HTML.
źródło
To powinno załatwić sprawę: umieść tag include w sekcji bloku.
page1.html:
page2.html:
źródło
Więcej informacji o tym, dlaczego to nie działa dla mnie na wypadek, gdyby pomogło przyszłym ludziom:
Powodem, dla którego to nie działało, jest to, że {% include%} w django nie lubi znaków specjalnych, takich jak fantazyjny apostrof. Dane szablonu, które próbowałem dołączyć, zostały wklejone z programu Word. Musiałem ręcznie usunąć wszystkie te znaki specjalne, a następnie zostały pomyślnie dołączone.
źródło
Nie możesz przeciągać bloków z dołączonego pliku do szablonu podrzędnego, aby nadpisać bloki szablonu nadrzędnego. Można jednak określić rodzica w zmiennej i określić szablon podstawowy w kontekście.
Z dokumentacji :
Zamiast oddzielnych „page1.html” i „page2.html”, umieść
{% extends base_template %}
na górze „commondata.html”. Następnie w swoim widoku określbase_template
jako „podstawa1.html” lub „podstawa2.html”.źródło
Dodano w celu odniesienia do przyszłych osób, które znajdą to w Google: W takich przypadkach możesz zajrzeć do tagu {% overextend%} dostarczonego przez bibliotekę mezzanine.
źródło
Edycja 10 grudnia 2015 r . : Jak wskazano w komentarzach, ssi jest przestarzały od wersji 1.8. Zgodnie z dokumentacją:
Moim zdaniem właściwą (najlepszą) odpowiedzią na to pytanie jest ta z podshumok , ponieważ wyjaśnia, dlaczego zachowanie include, gdy jest używane wraz z dziedziczeniem.
Byłem jednak nieco zaskoczony, że nikt nie wspomniał o tagu ssi dostarczonym przez system szablonów Django, który jest specjalnie zaprojektowany do umieszczania w wierszu zawierającego zewnętrzny fragment tekstu . W tym przypadku inline oznacza, że tekst zewnętrzny nie będzie interpretowany, analizowany ani interpolowany, ale po prostu „kopiowany” wewnątrz szablonu wywołującego.
Aby uzyskać więcej informacji, zapoznaj się z dokumentacją (sprawdź odpowiednią wersję Django w selektorze w prawej dolnej części strony).
https://docs.djangoproject.com/en/dev/ref/templates/builtins/#ssi
Z dokumentacji:
Uważaj również na konsekwencje tej techniki dla bezpieczeństwa, a także na wymagane definicje ALLOWED_INCLUDE_ROOTS, które należy dodać do plików ustawień.
źródło