TIL#118 Django Template

Dasom·2020년 12월 25일
0

Django

목록 보기
16/34
post-thumbnail

Django는 MVT(ModelViewTemplate)방식이다. 템플릿은 사용자에게 보여주는 화면, 즉 UI(User Interface)를 담당하고 있다. 템플릿에서는 로직을 표현하는 것이 아니라 사용자에게 어떻게 보여줄지에 대한 룩앤필을 표현한다.

템플릿 변수

템플릿 코드에서는 변수를 사용할 수 있다. 변수는 다음과 같은 형식을 사용한다.

{{ variable }}

변수명은 일반 프로그래밍의 변수명처럼 문자, 숫자, 밑줄(_)을 사용하여 이름을 정의한다. 또한 변수의 속성에 접근할 수 있는 도트(.) 표현식도 가능하다.

장고의 템플릿 시스템에서 .는 파이썬 언어와는 조금 다르다. 템플릿 문법에서 .를 만나면 장고는 다음 순서로 lookup을 시도한다.

예를 들어 foo.bar 라는 템플릿 변수가 있다면

  • foo가 딕셔너리 타입인지를 확인하고 맞다면 foo['bar']로 해석한다.
  • foo의 속성을 찾는다. bar라는 속성이 있으면 foo.bar로 해석한다.
  • foo가 리스트인지를 확인한다. 맞다면 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 %} 의 형식을 가진다. 시작 태그와 끝 태그가 둘다 있어야 하는 태그도 있다. 텍스트 결과물을 만들기도 하고 템플릿 로직을 제어하기도 하며, 외부 파일을 템플릿 내로 로딩하기도 한다.

{% for %}

# 운동선수 리스트에 들어있는 항목을 순회하면서 각 운동선수의 이름을 보여주는 코드

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}  # for 태그의 끝 태그
</ul>

{% if %}

{% 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

{% csrf_token %}

POST 방식의 폼을 사용하는 템플릿 코드에서는 CSRF(Cross Site Request Forgery) 공격을 방지하기 위해 {% csrf_token %} 태그를 사용해야 한다. 폼 데이터에는 악의적인 스크립트 문장이 들어있을 수도 있기 때문이다. 위치는 폼 엘리먼트의 다음에 넣어주면 된다. 이 태그를 사용하면 장고는 내부적으로 CSRF 토큰값의 유효성을 검증한다. 검증에 실패하면 사용자에게 403 에러를 보여준다.

{% url %}

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

{% with %}

특정 값을 변수에 저장해두는 기능을 한다.
변수의 유효범위는 with 구문 내, {% with %}에서 {% endwith %}까지이다. 데이터베이스를 조회하는 것처럼 부하가 큰 동작의 결과를 저장해 둠으로써 다시 동일한 동작이 필요한 경우에는 저장해 둔 결과를 활용하여 부하를 줄이기 위한 태그이다.

{% with total=business.employees.count %}
    {{ total }} people works at business
{% endwith %}
profile
개발자꿈나무🌲

0개의 댓글