이번에는 여러분들이 만드신 templates를 상속하는 방법에 대해서 이야기하고자 합니다.

혹시 여러 html을 작업하시다가 navbar 같은 곳에 메뉴 하나를 추가해주기 위해서 눈물을 흘리며 모든 html에 다 들어가서 navbar 태그를 찾고 하나하나 다 수정하셨던 경험이 있으신가요? 있으시다면 더 이상 그렇게 할 일은 없습니다.

템플릿 상속은, 기반이 되는 하나의 template을 만들고, 그것을 기반으로 다른 html을 작성하는 기법입니다.

base.html 생성

우리가 만들 base.html은 앞으로 상속받을 모든 html들의 기반이 될 예정입니다.

프로젝트명, 앱명은 사용자마다 다를 수도 있습니다!

프로젝트명, 앱명은 사용자마다 다를 수도 있습니다!

그 동안 우리는 app의 templates 폴더 안에서 계속 html파일을 만들곤 했죠? 이번에는 조금 다릅니다.

이번에는 project 폴더 안에 templates라는 폴더를 생성하고, 그 안에 base.html을 만들어봅시다.

그리고, 이 곳에 상속할 코드를 작성해 줍시다. 저는 bootstrap navbar를 임의로 가져와 보겠습니다. 저는 base.html을 다음과 같이 작성해 주었습니다:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- CSS only -->
    <link rel="stylesheet" href="<https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css>"
        integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
    <title>Document</title>
</head>

<body>
    <nav class="navbar navbar-expand-lg navbar-light bg-light">
        <a class="navbar-brand" href="#">Navbar</a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav"
            aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="navbarNav">
            <ul class="navbar-nav">
                <li class="nav-item active">
                    <a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="#">글쓰기</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="#">준비중입니다</a>
                </li>
            </ul>
        </div>
    </nav>

    **<div class='container'>
        {% block content %}
        {% endblock %}
    </div>**

</body>

<!-- JS, Popper.js, and jQuery -->
<script src="<https://code.jquery.com/jquery-3.5.1.slim.min.js>"
    integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj"
    crossorigin="anonymous"></script>
<script src="<https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js>"
    integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
    crossorigin="anonymous"></script>
<script src="<https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js>"
    integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI"
    crossorigin="anonymous"></script>

</html>

이렇게 한다면, 우리는 위의 코드를 통째로 상속이 되도록 할 예정입니다.

여기서 주목할 것은, 굵게 칠해진 코드인데요, 장고 내장 명령어를 이용해서 뭔가 새로운게 나왔습니다. 저 {% block content %}{% endblock %} 사이에 페이지마다 변경될 내용이 들어갈 예정입니다.

상속이 되도록 template 수정하기