
Chapter 03. 장고의 템플릿 언어
템플릿 언어는 Django 템플릿에서 사용할 수 있는 특수 구문입니다. 템플릿 변수, 템플릿 필터, 템플릿 태그, 템플릿 설명있다
템플릿 변수(템플릿 변수)
{{ 변수 }}
여는 중괄호와 닫는 중괄호를 두 번 입력하는 형태로 템플릿이 View에서 렌더링될 때 해당 변수가 의미하는 값으로 변환됩니다.
템플릿 렌더링에서 . (점) 연산자~이다 조회나타냅니다
템플릿 시스템이 렌더링 중에 변수 이름에 점이 있으면 다음 순서로 조회합니다.
- 사전 – 변수를 사전으로 간주하고 점 뒤의 키 값을 찾습니다.
- 속성 – 변수를 객체로 간주하고 객체의 내부 속성 값을 검색하거나 함수를 호출
- list – 변수를 목록으로 간주하고 점 뒤의 인덱스를 찾습니다.
예를 보자
사례1. 사전
# shop/views.py
def home(request):
context = {}
shopping_bag = {
'apple': 3,
'banana': 4,
'kimchi': 2,
'pork': 3,}
context('shopping_bag') = shopping_bag
return render(request, 'shop/index.html', context=context)
<!-- shop/templates/shop/index.html -->
{{shopping_bag.apple}}
<br>
{{shopping_bag.kimchi}}
삼
2
위 뷰에서 shopping_bag라는 딕셔너리를 컨텍스트 변수에 삽입하고 렌더링하면 템플릿에서 변수에 도트 연산자를 추가하여 키 값에 접근할 수 있습니다.
사례2. 기인하다
# shop/views.py
class Shop:
def __init__(self) -> None:
self.name = "롯데슈퍼"
self.location = "서울 은평구"
self.rank = 17
def goal(self):
return self.rank - 5
def __str__(self) -> str:
return self.name + ' 은평점'
def home(request):
context = {}
shop = Shop()
context('shop') = shop
return render(request, 'shop/index.html', context=context)
{{shop.name}}
<br>
{{shop.goal}}
<br>
{{shop}}
롯데슈퍼
12
롯데슈퍼은평
간단한 Shop 클래스를 만들고 그 안에 __init__ 메서드와 같은 간단한 함수를 만들었습니다.
Shop 클래스를 통해 Shop 인스턴스를 생성하고 컨텍스트 변수에 넣어 렌더링하면 위의 결과와 같이 객체에 접근할 수 있습니다.
사례3. 목록
def home(request):
context = {}
team_list = ('아드리아누', '페페', '호날두', '메시', '카시야스')
context('team') = team_list
return render(request, 'shop/index.html', context=context)
{{team.3}}
<br>
{{team.4}}
<br>
{{team.1}}
<br>
{{team.2}}
메시
카시야스
페페
호날두
위와 같이 team_list 리스트를 생성하고 컨텍스트 딕셔너리에 넣어 렌더링하면 team 형태로 접근할 수 있다.
템플릿 필터(템플릿 필터)
{{ 변수|filter }}
{{ 변수|filter:args }}
템플릿 변수에 파이프(|)를 쓰고 템플릿 필터를 사용하여 템플릿 변수를 변환할 수 있습니다.
Django에는 약 60개의 기본 제공 템플릿 필터가 있으며 개발자는 자신의 필터를 정의할 수도 있습니다.
다음은 몇 가지 템플릿 필터 예입니다.
1. 추가 : args만큼 추가 ( + )
이 필터는 두 값을 모두 정수로 강제 변환하려고 시도하고, 이것이 실패하면 어쨌든 값을 추가하려고 시도합니다.
정수로 강제 변환될 수 있는 문자열이 합산됩니다.
# shop/views.py
shopping_bag = {
'dumpling': "김치만두", # value가 문자열
'banana': (2, 4), # value가 리스트
'kimchi': 2, # value가 정수
'pork': 3.5,} # value가 실수
<!-- 문자열 -->
{{shopping_bag.dumpling|add:" 맛있다"}} <!-- 결과: 김치만두 맛있다 -->
<!-- 리스트 -->
{{shopping_bag.banana|add:5}} <!-- 결과: "" -->
{{shopping_bag.banana|add:"5"}} <!-- 결과: "" -->
{{shopping_bag.banana|add:(5,3)}} <!-- 결과: SyntaxError -->
{{shopping_bag.banana|add:shopping_bag.banana}} <!-- 결과: (2, 4, 2, 4) -->
<!-- 정수 -->
{{shopping_bag.kimchi|add:10}} <!-- 결과: 12 -->
{{shopping_bag.kimchi|add:"10"}} <!-- 결과: 12 -->
<!-- 실수 -->
{{shopping_bag.pork|add:5}} <!-- 결과: 8 -->
{{shopping_bag.pork|add:"5"}} <!-- 결과: 8 -->
{{shopping_bag.pork|add:5.5}} <!-- 결과: 8 -->
위의 예를 보면 목록에 대해 비변수 연산을 수행할 수 없는 것으로 보이며 정수에 10을 부여하든 “10”을 부여하든 결과는 동일합니다. 실수는 정수 부분만 연산에 참여하는 것 같습니다.
2. 속눈썹 추가 : 따옴표(‘) 앞의 백슬래시(\)붙이다
3. 캡퍼스트 : 첫 글자를 대문자로첫 번째 문자가 문자가 아니면 아무 효과가 없습니다.
4. 중앙: 주어진 폭의 필드 중앙 정렬하다
# shop/views.py
shopping_bag = {
'dumpling': "김치만두",
}
{{shopping_bag.dumpling|center:"20"}}
<h1>{{shopping_bag.dumpling|center:"20"}}</h1>
<textarea>{{shopping_bag.dumpling|center:"20"}}</textarea>


HTML에서는 공백을 아무리 많이 사용해도 하나로 줄어들기 때문에 화면에는 공백이 표현되지 않는 것처럼 보입니다.
(공백을 표현하려면 개행 문자를 사용하십시오.)
그런데 페이지 소스를 보면 여백이 제대로 적용된 것을 확인할 수 있습니다.
이 외에도 날짜 정보를 출력할 수 있는 date, 값이 없으면 다른 값을 출력하는 default, json 형식으로 변환해주는 json_script 등 다양한 템플릿 필터가 있다. 여기문서를 확인하려면 클릭하세요.
템플릿 태그(템플릿 태그)
{% tag %}
템플릿 언어의 꽃 템플릿 태그입니다.
템플릿을 생성할 때 루프문, 조건문 등의 로직을 이용하여 프로그래밍을 하듯 템플릿을 생성할 수 있습니다.
기본적으로 제공되는 태그가 있지만 개발자가 정의하여 사용할 수도 있습니다.
1. for : 반복 가능한 객체를 반복하여 템플릿 생성
# shop/views.py
shopping_bag = {
'dumpling': "김치만두", # value가 문자열
'banana': (2, 4), # value가 리스트
'kimchi': 2, # value가 정수
'pork': 3.5,} # value가 실수
<!-- shop/templates/shop/index.html -->
<h3>일반</h3>
{% for key, value in shopping_bag.items %}
{{key}}, {{value}}
<br>
{% endfor %}
<h3>역순!</h3>
{% for key, value in shopping_bag.items reversed %}
{{key}}, {{value}}
<br>
{% endfor %}

키 값과 값 값을 위와 같이 반복할 수 있습니다.
반전 키워드를 추가하여 역순으로 인쇄할 수 있습니다.
# shop/views.py
def home(request):
context = {}
numbers = ()
context('numbers') = numbers
return render(request, 'shop/index.html', context=context)
{% for number in numbers %}
{{number}}
<br>
{% empty %}
<p> 값이 없어요! </p>
{% endfor %}
가치가 없습니다!
값이 비어 있으면 {% empty %} 태그로 다른 값을 표시할 수 있습니다.
2. if : 조건문 형태의 템플릿 생성
# shop/views.py
def home(request):
context = {}
shopping_bag = {
'dumpling': "김치만두", # value가 문자열
'banana': (2, 4), # value가 리스트
'kimchi': 2, # value가 정수
'pork': 3.5,} # value가 실수
context('shopping_bag') = shopping_bag
return render(request, 'shop/index.html', context=context)
<!-- shop/templates/shop/index.html -->
{% for item in shopping_bag %}
{% if item == 'dumpling' %}
<p>만두를 고르셨습니다.</p>
{% elif item == 'kimchi' %}
<p>김치를 고르셨습니다.</p>
{% else %}
<p>나머지입니다.</p>
{% endif %}
{% endfor %}

위와 같이 if 태그의 조건에 따라 다른 결과를 얻을 수 있다.
3. with : 복잡한 변수의 별칭을 지정하는 데 사용되는 태그
# shop/views.py
def home(request):
context = {}
shopping_bag_full_of_apples = {
'apple': 6,
'green apple': 4,
'red apple': 2,
'pineapple': 8,}
context('shopping_bag_full_of_apples') = shopping_bag_full_of_apples
return render(request, 'shop/index.html', context=context)
<!-- shop/templates/shop/index.html -->
{% with shopping_bag_full_of_apples as bag %}
{{ bag.pineapple }}
{% endwith%}
<br>
{{ shopping_bag_full_of_apples.pineapple}}
8
8
with 태그 내에서 길고 복잡한 변수는 bag이라는 짧은 별칭을 붙여서 사용할 수 있습니다.
더 많은 템플릿 태그 설명 여기 공식 문서를 확인하세요.
템플릿 설명(템플릿 주석)
{# comments #}
{% comment %}
<p> comment with Multiple lines </p>
{% endcomment %}
템플릿 언어의 주석이며 한 줄 또는 여러 줄로 작성할 수 있습니다.
템플릿 주석은 다른 템플릿 주석에 포함될 수 없습니다.