django Template

행행·2022년 6월 5일
0
post-thumbnail

Django Template

  • 데이터 표현을 제어하는 도구이자 표현에 관련된 로직
  • 사용하는 built-in system
    • Django template language

Djang Template Language(DTL)

  • Djnago tempalte에서 사용되는 built-in template system
  • 조건, 반복, 치환, 변수, 필터 등의 기능을 제공
  • 단순히 Python이 HTML에 포함 된 것이 아니며, 단순히 프로그래밍적 로직이 아니라 프레젠테이션을 표현하기 위한 것
  • Python 처럼 일부 프로그래밍 구조(if, for 등)를 활용할 수 있지만, 이것은 해당 Python 코드로 실행되는 것이 아님

DTL Syntax

  1. Variable
  2. Filters
  3. Tags
  4. Comments

DTL Syntax-Variable

{{ variable }}

  • render()를 사용하여, views.py에서 정의한 변수를 template 파일로 넘겨 사용하는 것
  • 변수명은 영어, 숫자와 밑줄(_)의 조합으로 구성될 수 있으나 밑줄로는 시작될 수 없음
    • 공백이나 구두점 문자 사용할 수 없음
  • dot(.)을 사용하여 변수 속성에 접근할 수 있음
  • render()의 세번째 인자로 {’key’: value} 와 같이 딕셔너리 형태로 넘겨주며, 여기서 정의한 key에 해당하는 문자열이 template에서 사용 가능한 변수명이 됨

DTL Syntax-Filters

{{ variable|filter }}

  • 표시할 변수를 수정할 때 사용
  • 예시)
    • name 변수를 모두 소문자로 출력
    • {{ name|lower }}
  • 60개 bulit-in template filters를 제공
  • chained 가 가능하며 일부 필터는 인자를 받기도 함
    • {{ variable|trunvateword:30 }}

DTL Syntax-Tags

{% tag %}

  • 출력 텍스트를 만들거나, 반복 또는 논리를 수행하여 제어 흐름을 만드는 등 변수보다 복잡한 일들을 수행
  • 일부 태그는 시작과 종료태그가 필요
    • {% if %}{% endif %}
  • 약 24개의 built-in template tags를 제공

DTL Syntax-Comments

{# #}

  • Djnago template에서 라인의 주석을 표현하기 위해 사용
  • 여러줄 주석은 {% comment %}{% endcomment %} 사용

코드작성순서

  • 데이터 흐름에 맞추어 작성
  1. urls.py
  2. views.py
  3. templates

Template ingeritance(템플릿 상속)

  • 템플릿 상속은 기본적으로 코드의 재사용성에 초점을 맞춤

  • 템플릿 상속을 하면 사이트의 모든 공통 요소를 포함하고, 하위 템플릿이 재정의(override)할 수 있는 블록을 정의하는 기본 “skeleton” 템플릿을 만들 수 있음

  • {% extends=''%}

    • 자식 템플릿이 부모 템플릿을 확장한다는 것을 알림
    • 반드시 템플릿 최상단에 작성 되어야 함
  • {%blcok content%} {%endblock%}

    • 하위 템플릿에서 재지정(overridden)할 수 있는 블록을 정의
    • 즉 하위 템플릿이 채울 수 있는 공간
  • app_name/templates 디렉토리 외 템플릿 추가경로 설정


#procjec_name/settings.py

TEMPLATES=[
	'DIRS' : [BASE_DIR / 'templates'] ,
]

<!--folder_name/templates/base.html-->
<!DOCTYPE html>

<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link href="<https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/css/bootstrap.min.css>" rel="stylesheet" integrity="sha384-KyZXEAg3QhqLMpG8r+8fhAXLRk2vvoC2f3B09zVXn8CA5QIVfZOJ3BCsw2P0p/We" crossorigin="anonymous">
  <title>Document</title>
</head>
<body>
  <div class="container">
    {% block content %}
    {% endblock content%}
  </div>
  <script src="<https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/js/bootstrap.bundle.min.js>" integrity="sha384-U1DAWAznBHeqEIlVSCgzq+c9gqGAJn5c/t99JyeKa9xxaYpSvHU5awsuZVVFIhvj" crossorigin="anonymous"></script>
</body>
</html>


  • Template Tag -”include”

    • {% include ‘ ’ %}
    • 템플릿을 로드하고 현재 페이지로 렌더링
    • 템플릿 내에 다른 템플릿을 포함하는 방법
    • ex) templates 폴더에 nav.html을 만들고, base.html에서 include를 하는 것이다.

Django template system(Django 설계철학)

  • 표현로직(view)을 분리
    • 템플릿 시스템은 표현을 제어하는 도구이자 표현에 관련된 로직일 뿐이라고 생각한다.
    • 즉, 템플릿 시스템은 이러한 기본 목표를 넘어서는 기능을 지원하지 말아야 한다.

  • 중복을 배제
    • 대다수의 동적 웹사이트는 공통 header, footer, navbar 같은 사이트 공통 디자인을 갖는다.
    • Django 템플릿 시스템은 이러한 요소를 한 곳에 저장하기 쉽게 하여 중복 코드를 없애야 한다.
    • 이것이 템플릿 상속의 기초가 되는 철학이다.
profile
성장하려고 분투 중인 개발자

0개의 댓글