Django

11. Template Tag(템플릿 태그)

테니드2 2021. 4. 8. 14:50

템플릿 태그는 {% tag %} 형식을 가진다.

 

- {% for %} 태그

<ul>
{% for athlete in athlete_list %}
	<li>{{ athlete.name }}<li>
{% endfor %}
</ul>

리스트에 담겨 있는 항목들을 순회하면서 출력

변수명 설명
forloop.counter 현재까지 루프를 실행한 루프 카운트(1부터 카운트함)
forloop.counter() 현재까지 루프를 실행한 루프 카운트(0부터 카운트함)
forloop.revcounter 루프 끝에서 현재가 몇 번째인지 카운트한 숫자(1부터 카운트)
forloop.revcounter() 루프 끝에서 현재가 몇 번째인지 카운트한 숫자(0부터 카운트)
forloop.first 루프에서 첫 번째 실행이면 True 값을 가짐
forloop.last 루프에서 마지막 실행이면 True 값을 가짐
forloop.parentloop 중첩된 루프에서 현재의 루프 바로 상위의 루프를 의미함

 

- {% if %} 태그

{% if athlete_list %}
	Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
	Athletes should be out of the locker room soon!
{% else %}
	No athletes.
{% endif %}

변수를 평가하여 조건이 True이면 바로 아래의 문장이 출력된다. 

{% if %} 태그에는 불린 연산자를 사용할 수 있다. ex) and, or, not, and not, ==, !=, <, >, <=, >=, in, not in

 

- {% csrf_token %} 태그

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

POST 방식의 <form>을 사용하는 템플릿 코드에서는 CSRF 공격을 방지하기 위해 이 태그를 사용한다.

이 태그를 사용하면 내부적으로 CSRF 토크값의 유효성을 검증하여 만일 토큰 검증에 실패하면 사용자에게 403에러는 보여준다.

한 가지 주의할 점은 CSRF 토큰값이 유출될 수도 있으므로, 외부 URL로 보내는 <form>에는 사용하지 않도록 한다.

 

※CSRF 공격이란

CSRF(Cross-Site Request Forgery)는 사이트 간 요청 위조 공격이라는 뜻이다. 특정 웹 사이트에서 이미 인증을 받은 사용자를 이용하여 공격을 시도한다. 인증을 받은 사용자가 공격 코드가 삽입된 페이지를 열면 공격 대상이 되는 웹 사이트는 위조된 공격 명령이 믿을 수 있는 사용자로부터 발송된 것으로 판단하게 되어 공격을 받게 된다.

 

- {% url %} 태그

{% url 'namespace:view-name' arg1 arg2 %}
  • namespace : urls.py 파일의 include() 함수 또는 app_name 변수에 정의한 이름 공간
  • view-name : urls.py 파일에서 정의한 URL 패턴 이름
  • argN: 뷰 함수에서 사용하는 인자로, 없을 수도 있고 여러 개인 경우 공백으로 구분

 

<form action={% url 'polls:vote' question.id %} method="post">

주된 목적은 템플릿 코딩을 할때 URL을 하드코딩하는 것을 방지 하기 위해서이다. 이 코드는 다음의 코드와 유사한 코드이다.

 

<form action="/polls/3/vote/" method="post">

 

 - {% with %} 태그

{% with total=business.employess.count %}
	{{ total }} people works at business
{% endwith %}

 

with 태그는 with 영역에서만 유효한 변수를 정의 하여 사용할 수 있다. 이 태그는 DB를 조회하는 것과 같은 부하가 큰 동작을 결과를 저장해 둠으로써 동일한 동작에 대한 부하를 줄이기 위해 사용한다.

 

- {% load %} 태그

{% load somelibrary package.otherlibrary %}

사용자 정의 태그 및 필터를 로딩해준다.

 

출처: 한빛미디어, Django로 배우는 쉽고 빠른 웹 개발 파이썬 웹 프로그래밍