본문 바로가기
Django

03_Template & DTL

by MeaninGood 2022. 3. 20.

1. Django Template Language (DTL)

  • Django template 에서 사용하는 built-in template system
  • 조건, 반복, 변수 치환, 필터 등의 기능 제공
  • 프로그래밍적 로직 x!! 프레젠테이션을 표현하기 위한 것
  • if, for 등을 사용한다고 해서 Python 코드인 것은 아님

 

 

1) Variable

{{ variable }}
  • render()를 사용하여 views.py에서 정의한 변수를 template 파일로 넘겨 받아 사용
  • 변수명은 영어, _로 구성. _로 시작 불가. 공백, 구두점 사용 불가.
  • dot(.)을 사용하여 변수 속성에 접근
  • render()의 세번째 인자로 'key' : value의 딕셔너리 형태로 넘겨줌.
    여기서 정의한 key에 해당하는 문자열이 template에서 사용 가능한 변수명.

 

 

2) Filters

  • 표시할 변수를 수정할 때 사용
{{ variable|filter }}


# name 변수를 모두 소문자로 출력
{{ name|lower }}


# chained 가능, 일부 필터는 인자를 받기도 함
{{ variable|truncatewords:30 }}

 

 

3) Tags

{% tag %}

{% if %}{% endif %}
  • 출력 텍스트를 만들거나, 반복 또는 논리를 수행하여 제어 흐름 만듦.
  • 변수보다 복잡한 일들을 수행
  • 일부 태그는 시작과 종료 태그 필요

 

 

4) Comments

# 한 줄 주석
{# #}


# 여러줄 주석
{% comment %}
{% endcomment %}

 

 

 

2. 코드 작성 순서

  • urls.py -> views.py -> templates
# urls.py

urlpatterns = [
	path('admin/', admin.site.urls),
    path('index/', views.index),
    path('greeting/', views.greeting),
]
# views.py

def greeting(request):
	return render(request, 'greeting.html', {'name':'Hong'})
<!-- greeting.html -->

<p> 안녕 나는 {{ name }} 이야. </p>

 

  • 실습
# views.py

def greeting(request):
	foods = ['apple', 'banana', 'mango',]
    info = {
    	'name' : 'Hong'
    }
    context = {
    	'foods' : foods,
        'info' : info,
    }
    return render(request, 'greeting.html', context)
<!-- greeting.html -->

<h1> 안녕 나는 {{ info.name }} 이야.</h1>
<p> 난 {{ foods }}를 좋아해.</p>
<p> 특히 {{ foods.0 }}을 가장 좋아하지.</p>

<a href="/index/">뒤로</a>

 

  • 랜덤 인자 넘겨주기 + filter
# urls.py

urlpatterns = [
	...,
    path('dinner/', views.dinner),
]
# views.py

import random

def dinner(request):
	foods = ['햄버거', '피자', '치킨', '삼겹살']
    pick = random.choice(foods)
    context = {
    	'pick' : pick,
        'foods' : foods,
    }
    return render(request, 'dinner.html', context)
<!-- dinner.html -->

<h1> 오늘 메뉴는 {{ pick }}</h1>
<p>{{ pick }}은 {{ pick|length }}글자</p>
<p>{[ foods|join:", "}}</p>

 

 

 

2. Tags

  • for로 반복문 돌리기
<!-- dinner.html -->

<h1>메뉴판</h1>
<ul>
  {% for food in foods %}
    <li>{{ food }}</li>
  {% endfor %}
</ul>

 

  • extends (override) / 상속
{% extends 'base.html' %}

- 자식(하위) 템플릿이 부모 템플릿을 확장한다는 것을 알림
- 반드시 템플릿 최상단에 작성

 

  • block content (overridden)
{% block content %}
{% endblock %}

- 하위 템플릿에서 재지정(overridden) 할 수 있는 블록 정의
- 즉, 하위 템플릿이 채울 수 있는 공간

 

# settings.py

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

- app_name/templates 디렉토리 외 템플릿 추가 경로 설정

 

  • include (다른 템플릿 포함)
{% include '' %}

- 템플릿을 로드하고, 현재 페이지로 렌더링
- 템플릿 내에 다른 템플릿을 "포함(including)"
ex) {% include '_nav.html' %}을 base.html에 써주기

'Django' 카테고리의 다른 글

05_Django ORM  (0) 2022.09.17
04_HTML Form  (0) 2022.03.20
02_Request & Response  (0) 2022.03.19
01_Django?  (0) 2022.03.19