Django는 MVT(ModelViewTemplate)방식이다. 템플릿은 사용자에게 보여주는 화면, 즉 UI(User Interface)를 담당하고 있다. 템플릿에서는 로직을 표현하는 것이 아니라 사용자에게 어떻게 보여줄지에 대한 룩앤필을 표현한다.
템플릿 코드에서는 변수를 사용할 수 있다. 변수는 다음과 같은 형식을 사용한다.
{{ variable }}
변수명은 일반 프로그래밍의 변수명처럼 문자, 숫자, 밑줄(_)을 사용하여 이름을 정의한다. 또한 변수의 속성에 접근할 수 있는 도트(.) 표현식도 가능하다.
장고의 템플릿 시스템에서 .는 파이썬 언어와는 조금 다르다. 템플릿 문법에서 .를 만나면 장고는 다음 순서로 lookup을 시도한다.
예를 들어 foo.bar 라는 템플릿 변수가 있다면
장고의 템플릿 문법에서도 템플릿 변수에 필터를 적용하여 변수의 출력 결과를 변경할 수 있다.
필터는 파이프(|) 문자를 사용한다.
# name 변수값의 모든 문자를 소문자로 바꿔주는 필터
{{ name|lower }}
# bio 변수값 중에서 앞의 30개 단어만 보여주고 줄바꿈 문자는 모두 없애기
{{ bio|truncatewords:30 }}
# value 변수값이 False 거나 없는 경우 'nothing'으로 출력
{{ value|default:'nothing' }}
# value 변수값의 길이를 반환. 스트링이나 리스트인 경우도 가능
{{ value|length }}
# value 변수값에서 html 태그를 모두 없애기. 100% 보장은 아님
{{ value|striptags }}
# 복수 접미사 필터
You have {{ num_messages }} message{{ num_messages|pluralize }}
-> 만약 메세지가 1개라면 "You have 1 message" 2개라면 "You have 2 messages"
You have {{ num_dishes }} dishes{{ num_dishes|pluralize:'es' }}
-> 기본형이 '-s'이며 '-es'를 붙이고 싶다면 위처럼 함
You have {{ num_cherries }} cherry{{ num_cherries|pluralize:'y,ies' }}
-> 'y'를 빼고 '-ies' 를 붙이고 싶은 경우
# 더하기(데이터 타입에 따라 결과가 달라지므로 주의)
{{ value|add:'2' }}
-> value가 3이라면 결과는 5로 출력
{{ first|add:second }}
-> first='python', second='django' 라면 'pythondjango'
-> first=[1,2,3], second=[4,5,6] 라면 [1,2,3,4,5,6]
-> first=5, second=10 라면 15
{% tag %} 의 형식을 가진다. 시작 태그와 끝 태그가 둘다 있어야 하는 태그도 있다. 텍스트 결과물을 만들기도 하고 템플릿 로직을 제어하기도 하며, 외부 파일을 템플릿 내로 로딩하기도 한다.
# 운동선수 리스트에 들어있는 항목을 순회하면서 각 운동선수의 이름을 보여주는 코드
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %} # for 태그의 끝 태그
</ul>
{% if athlete_list %} # True이면 운동선수의 숫자 출력
Number of athlete: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
Athletes should be out of the locker room soon!
{% else %}
No athletes.
{% endif %} # if 태그의 끝 태그
{% if %} 태그는 필터와 연산자를 사용할 수 있다.
아래와 같은 불린 연산자를 사용할 수 있다
and, or, not, and not, ==, !=, <, >, <=, >=, in, not in
POST 방식의 폼을 사용하는 템플릿 코드에서는 CSRF(Cross Site Request Forgery) 공격을 방지하기 위해 {% csrf_token %} 태그를 사용해야 한다. 폼 데이터에는 악의적인 스크립트 문장이 들어있을 수도 있기 때문이다. 위치는 폼 엘리먼트의 다음에 넣어주면 된다. 이 태그를 사용하면 장고는 내부적으로 CSRF 토큰값의 유효성을 검증한다. 검증에 실패하면 사용자에게 403 에러를 보여준다.
{% url 'namespace:view-name' arg1 arg2 %}
특정 값을 변수에 저장해두는 기능을 한다.
변수의 유효범위는 with 구문 내, {% with %}에서 {% endwith %}까지이다. 데이터베이스를 조회하는 것처럼 부하가 큰 동작의 결과를 저장해 둠으로써 다시 동일한 동작이 필요한 경우에는 저장해 둔 결과를 활용하여 부하를 줄이기 위한 태그이다.
{% with total=business.employees.count %}
{{ total }} people works at business
{% endwith %}