Template Tag - 친숙한 파이썬 문법을 템플릿 코드에서 작성하기

박세웅·2021년 8월 26일
0

템플릿 시스템

템플릿 시스템은 python 코드를 html에서 활용할 수 있도록 django에서 고안한 시스템이다. 시스템에서 활용하는 템플릿 코드는 파이썬 언어의 문법과는 다르며, 템플릿 시스템에서만 사용되는 고유의 문법이다. 템플릿 코딩은 로직을 표현하는 것이 아닌, 구현된 로직을 사용자에게 보여주는 방법이다.

변수, 필터, 태그 등이 있으며 여기서는 쉽게 활용되는 템플릿 태그에 대해서 알아본다.

템플릿 태그

템플릿 태그는 {% tag %}의 형식을 가진다. 어떤 태그든 시작 태그와 끝 태그 둘 다 있어야 된다. 템플릿 태그는 {% for %} 태그와 {% if %} 태그가 많이 활용되며, {% csrf_token %}도 많이 활용된다. 이 밖에도 {% url %}, {% with %}, {% load %} 태그 등이 있다. 자세한 태그는 여기에서 확인할 수 있다.(django 공식 문서)

{% for %} 태그

리스트에 담겨 있는 항목들을 순회하며 출력할 수 있다. 예시 코드는 다음과 같다. 참고로 View에서 DB 객체를 가져올 때, 리스트 형태로 가져오게 된다.(class.object.all())

<ul>

{% for product in products %}
	<li> {{ product.name }} </li>
{% endfor %}

</ul>

템플릿 for 태그에서는 다양한 변수들을 제공하고 있으므로, 활용하면 도움된다. 대표적으로 forloop.counter()를 활용할 수 있다.

{% if %} 태그

다음은 if 태그이다. 파이썬 문법 활용하는 방식이랑 비슷하며, if 태그에서는 필터와 연산자를 활용할 수 있다. 템플릿 필터는 {{ product|length }}와 같이 활용할 수 있다. 주의할 점은 대부분의 필터가 스트링을 반환하므로 산술 연산이 안 되는데, length 필터만 예외적으로 가능하다는 점이다.

{% if product_list|length > 1 %}
	<p>상품이 존재합니다.</p>
{% else %}
	<p>상품이 존재하지 않습니다.</p>
{% endif %}

{% csrf_token %} 태그

POST방식의 form 태그를 사용하는 템플릿 코드에서는 CSRF 공격을 방지하기 위해 {% csrf_token %} 태그를 사용해야 한다. 폼 데이터에는 악의적인 스크립트 문장이 들어있을 수도 있기 때문이다.

  <form action = "." method='post'>
  {% csrf_token %}
                             

이 태그는 form 엘리먼트의 첫 줄 다음에 바로 넣어주면 된다. 이 태그를 사용하게 되면 장고는 내부적으로 CSRF 토큰값의 유효성을 검증하게 된다.

CSRF 공격은 사이트 간 요청 위조 공격이라고도 하는데, 이미 인증을 받은 사용자를 이용하여 공격을 시도한다. 자세한 내용은 생략한다.

{% url %} 태그

이 태그는 소스에 url을 직접 코딩하는 것을 방지하기 위함이다. 만약에 100개의 페이지를 번호로 매기고, 사용자의 반응에 맞는 번호의 페이지를 열게 하는 서비스가 있다고 하자. 이 경우, 번호는 변수이므로 html 페이지에 일일이 코딩하기 보다는 변수로 받아서 코드량을 줄여주는 것이 현명하다. 페이지 번호가 1~10이라면 하드코딩 시 10개 요소를 써야되지만, 변수로 받으면 1개 요소만 쓰면 되기 때문이다.

사용법은 다음과 같다.

{% url 'namespace:view-name' arg1 arg2 %}
  • namespace : urls.py 파일의 include()함수 또는 app_name 변수에 정의한 이름 공간(namespace)의 이름. 현재 만드는 app의 이름을 써주면 된다.
  • view-name : urls.py 에서 정의한 URL 패턴 이름을 적어주면 된다.
  • argN : 뷰 함수에서 사용하는 인자인데, 없을 수도 있고 여러 개인 경우 빈칸으로 구분한다.

{% with %}

파이썬의 with 구문과 활용이 같다. with 구문 내에서 특정 값을 변수에 저장해두는 기능을 한다. 예시 코드는 다음과 같다.

{% with total=business.employees.count %}

	{{ total }} people works at business

{% endwith %}

{% load %}

사용자 정의 태그나 필터를 로딩해준다. 예시 코드는 다음과 같다.

{% load somelibrary package.otherlibrary %}

이 문장은 somelibrary.py 파일과 package/otherlibrary.py에 정의된 사용자 정의 태그 및 필터를 로딩해준다.

참고 자료

파이썬 웹 프로그래밍(2018, 김석훈 지음, 한빛미디어)

profile
개발, 투자, 운동, 영화에 관심이 많습니다.

0개의 댓글