템플릿의 파일 이름은 템플릿 로더에 좌우됨. 예를 들어, FileSystemLoader 사용하면 파일 이름을 제공하여 다른 템플릿에 접근 가능. 슬래시 사용해 하위 디렉터리의 템플릿에 접근 가능.
{% extends "layout/default.html" %}
그러나 이 동작은 Jinja를 포함하는 애플리케이션에 따라 달라질 수 있음. 자식 템플릿은 footer 블록을 정의하지 않으므로 부모 템플릿의 값이 대신 사용됨.
3.
동일한 템플릿에서 동일한 이름을 가진 여러 개의 {% block %} 태그를 정의할 수 없음. (∵ block 태그가 "양쪽" 방향으로 작동하기 때문임. 즉, block 태그는 자리 표시자 역할 뿐만 아니라 부모의 자리 표시자를 채우는 콘텐츠도 정의함. 템플릿에 비슷한 이름의 {% block %} 태그가 두 개 있는 경우 해당 템플릿의 부모는 블록의 콘텐츠 중 어떤 것을 사용할지 알 수 없음.)
단, self 변수로 해당 블록을 여러 번 호출해 출력 가능.
<title>{% block title %}{% endblock %}</title>
<h1>{{ self.title() }}</h1>
{% block body %}{% endblock %}
슈퍼 블럭 (Super Blocks)
※ super() 호출하면 부모 블록의 내용을 렌더링 가능.
{% block sidebar %}
<h3>Table Of Contents</h3>
...
{{ super() }}
{% endblock %}
중접 확장 (Nesting extends)
※ {% extenses %} 수준이 중첩적일 때, 바로 위 부모 템플릿을 건너뛰고 그 보다 상위 템플릿을 상속해야 할 경우 super.super() 같이 체인화.
# parent.tmpl
body: {% block body %}Hi from parent.{% endblock %}
# child.tmpl
{% extends "parent.tmpl" %}
{% block body %}Hi from child. {{ super() }}{% endblock %}
{# 렌더링 결과: Hi from child. Hi from parent. #}
# grandchild1.tmpl
{% extends "child.tmpl" %}
{% block body %}Hi from grandchild1.{% endblock %}
{# 렌더링 결과: Hi from grandchild1. #}
# grandchild2.tmpl
{% extends "child.tmpl" %}
{% block body %}Hi from grandchild2. {{ super.super() }} {% endblock %}
{# 렌더링 결과: Hi from grandchild2. Hi from parent. #}
명명된 블록 종료 태그 (Named Block End-Tags)
※ 가독성 ↑
{% block sidebar %}
{% block inner_sidebar %}
...
{% endblock inner_sidebar %}
{% endblock sidebar %}
PS. endblock 태그 뒤 이름은 block 태그 뒤 이름과 일치해야 함.
블록 중첩 및 범위 (Block Nesting and Scope)
1.
블록은 더 복잡한 레이아웃을 위해 중첩될 수 있음. 그러나 기본적으로 블록은 외부 범위의 변수에 접근 못 함.