(Django) Django 기초 – (2) 템플릿 언어


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>


4. 센터 결과


페이지 소스보기

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 태그

위와 같이 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 %}

템플릿 언어의 주석이며 한 줄 또는 여러 줄로 작성할 수 있습니다.

템플릿 주석은 다른 템플릿 주석에 포함될 수 없습니다.