티스토리 뷰

Python/* Django

10. Django 템플릿 상속

포꾼 2017. 12. 13. 15:39

여러 템플릿 파일 별로 필연적으로 발생하는 중복상속을 통해 중복 제거 상속은 여러 번 이뤄질 수 있다.

부모 템플릿전체 레이아웃을 정의하며, 자식 템플릿이 재정의할 block 을 다수 정의해야 한다.

자식 템플릿부모 템플릿을 상속받은 후에 부모 템플릿의 block 영역에 대해 재정의만 가능하며 그 외 코드는 무시


템플릿 상속 문법 : 항시 자식템플릿 코드 내, 최상단에 쓰여져한다.


{% extends "부모템플릿경로" %}


템플릿 상속을 사용 전

 # /blog/templates/blog/post_list.html

<!doctype html>

<html>

<head>

<meta charset="utf-8" />

<title>AskDjango Blog</title>

</head>


<body>

<h1>AskDjango Blog</h1>


{% for post in post_list %}

<a href="{% url "blog:post_detail" post.id %}">{{ post.title }}</a>

{% endfor %}

<hr/>

&copy; 2017. AskDjango

</body>

</html>



# /blog/templates/blog/post_detail.html

<!doctype html>

<html>

<head>

<meta charset="utf-8" />

<title>AskDjango Blog</title>

</head>


<body>

<h1>AskDjango Blog</h1>

        <h2>{{ post.title }}</h2>

{% if post.image %}

<img src="{{ post.image.url }}" />

{% endif %}

{{ post.content|linebreaks }}


<hr/>

&copy; 2017. AskDjango

</body>

</html>

## 회색 표시 부분 post_list.html 과 post_detail.html의 중복 발생 


템플릿 상속 사용 후

# blog/templates/blog/post_list.html


{% extends "blog/layout.html" %}


{% block content %} # 재정의할 블락

    {% for post in post_list %}

        <a href="{% url "blog:post_detail" post.id %}">{{ post.title }}</a>

    {% endfor %}

{% endblock %}

 


# blog/templates/blog/post_detail.html


{% extends "blog/layout.html" %}


{% block content %}

    <h2>{{ post.title }}</h2>

        {% if post.image %}

            <img src="{{ post.image.url }}" />

        {% endif %}

        {{ post.content|linebreaks }}

{% endblock %}


## block정의 이후 block바깥쪽에 코드를 작성할 경우 전부 무시 된다.

## 재정의만 가능하다. 부모탬플릿에 정의가 되어있지 않으면 사용이 불가능 하다.


부모 탬플릿의 구성

# blog/layout.html  ## 중복이 발생 한 부분에 대해서 layout.html을 작성


<!doctype html>

<html>

<head>

<meta charset="utf-8" />

<title>AskDjango Blog</title>

</head>


<body>

<h1>AskDjango Blog</h1>


{% block content %} ## 자식 영역이 body부분을 재정의 할수 있도록 block영역을 정의,  이름은 중복이 불가능하다.

{% endblock %}


<hr/>

&copy; 2017. AskDjango

</body>

</html> 


2단계의 상속을 추천

+ 프로젝트 전반적인 레이아웃 템플릿 : askdjango/templates/layout.html

- 각 앱 별 레이아웃 템플릿 #1 : blog/templates/blog/layout.html

- 각 템플릿 #1 : blog/templates/blog/post_list.html

- 각 템플릿 #2 : blog/templates/blog/post_detail.html

- 각 템플릿 #3 : blog/templates/blog/post_form.html


- 각 앱 별 레이아웃 템플릿 #2 : shop/templates/shop/layout.html

- 각 템플릿 #4 : shop/templates/shop/item_list.html

- 각 템플릿 #5 : shop/templates/shop/item_detail.html

- 각 템플릿 #6 : shop/templates/shop/item_order_form.html


(중요) 상속은 최상단에 써야 하며, 부모 탬플릿에서 정의되지않은 block은 자식탬플릿에서도 정의가 불가능 하다. 무조건, 부모탬플릿에 정의된 block만 사용 가능




"""본 내용은 AskDjango VOD, "장고 차근차근 시작하기" 강의내용을 참고하여 작성했습니다.(https://nomade.kr/)"""


반응형

'Python > * Django' 카테고리의 다른 글

12. URL Reverse  (0) 2017.12.13
11. Django Template Loader  (0) 2017.12.13
9. Model Relationship Fields  (2) 2017.12.13
8. Http Status Code 404  (0) 2017.12.13
7. 모델을 통한 데이터 CRUD  (0) 2017.12.12
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함