본문 바로가기
  • 가제가재_기록블로그
개념모음

Jinja Template / Django Template

by 가제가재 2023. 8. 1.

내용은 Ctr+F 로 찾자!

23.08.01 코드를 작성하던 중 문득 Jinja Templates 와 Django Templates 의 차이점이 궁금해졌다.

궁금해서 찾아봤고 정리를 위해 이 문서를 작성한다.

 

23.08.03 for 문 예제와 설명을 추가했다.

 

Jinja Template

Jinja Template 홈페이지

jinja Template 는 Python 기반의 템플릿 언어로 마크 업 언어(ex.HTML...) 에서도 동적인 데이터를 표현할 수 있도록 돕는다.

 

즉, HTML 코드 내부에서 Python의 For, if 등의 함수와 변수를 사용할 수 있도록 돕는 템플릿이다.

 

주로 Flask 웹 프레임워크와 함께 사용되나, 그 외 파이썬에 익숙한 개발자들이 다양한 곳에서 사용한다.


Django Template

Django Template 홈페이지

Django 는 Python 기반의 템플릿 언어로 마크 업 언어(ex.HTML...) 에서도 동적인 데이터를 표현할 수 있도록 돕는다.

 

놀랍게도 Django와 Jinja 가 같은 일을 한다~.

 


Jinja Template / Django Template

같은 개념인 줄 알았는데 다른 개념이었다.

무엇이 더 나은지는 개발자의 취향이고, 이 둘의 차이를 인식하고 적절한 활용을 하도록 하자.


공통점

1. Python 기반의 템플릿 언어이다. 즉, 작성 할 때에는 Python 문법을 기반으로 작성한다.

 

2. 변수 삽입: 두 템플릿 모두 중괄호 `{{ }}` 를 이용해 템플릿 내부에 변수를 삽입할 수 있다. 이를 이용해 마크업 언어에서도 동적인 데이터 출력이 가능하다.

 

3. 제어 구조: 두 템플릿 모두 `{% ~~ %} `를 사용해 제어 구조 정의가 가능하다.


차이점

1. 문법의 차이.

 - Django : 간단하고, 직관적이다. 변수는 `{{ }}` / 제어는 `{% ~~ %} ` 를 사용한다.

 - Jinja : 유연하고 강력하다. 변수는 `{{ }}` / 제어는 `{% ~~ %} ` 를 사용하지만, 옵션이 Django 에 비해 매우 다양해서 딱 잘라 말하긴 어렵다.

 

2. 태그 이름 충돌

 - Django : 일부 태그는 HTML과 유사하여 가끔 헷갈림

 - Jinja : 문법이 아예 달라 혼동의 여지가 없음

 

3. 기능

 - Django : 기본적인 기능들을 제공. 복잡한 로직의 한계 존재

 - Jinja : 매우 유연한 기능 제공. 작성만 가능하다면 얼마든지 복잡한 로직을 짤 수 있다.

 

4. 성능

 - Django : 상황에 따라 매우 달라지지만, 일반적으로 Jinja 에 비해 무겁고 렌더가 느리다.

 - Jinja : 상황에 따라 매우 달라지지만, 일반적으로 Django 에 비해 가볍고 렌더가 빠르다.


Django Template 사용하기

얼핏 보면 Jinja 가 Django에 비해 좋아보인다.

하지만 현재 내가 사용하려는 기능들은 Django 에서도 충분히 구현이 가능 하기 때문에 Django Template 사용을 기준으로 이 문서를 작성한다.


1. 변수 삽입하기

 

{{ username }}

{{ }} 를 사용해 템플릿 내부에 변수를 삽입할 수 있다.

위 코드는 변수 username 을 출력한다.

활용

<!-- template.html -->
<!DOCTYPE html>
<html>
<head>
    <title>{{ title }}</title>
</head>
<body>
    <h1>Hello, {{ name }}!</h1>
</body>
</html>
# views.py
from django.shortcuts import render

def hello(request):
    context = {
        'title': 'Django Templates Example',
        'name': 'John Doe',
    }
    return render(request, 'template.html', context)

 

 

2. 제어 구조

 

{% if user.is_authenticated %}
    <p>Welcome, {{ user.username }}!</p>
{% else %}
    <p>Please log in to continue.</p>
{% endif %}

 

위 구조와 같이 `{% %}` 구조를 이용해 여러가지 함수를 사용할 수 있다.

 

if 문 외에도 자주쓰는 코드를 모아봤다.

{% for %}{% endfor %}	# Python 의 그 for 문이 맞다.

{% block%}{% endblock %}# 템플릿을 상속할 수 있다.

{% csrf_token %}	# 보안을 위한 csrf 기능을 불러온다.

 

예문 1.

 

{% for todo in todos %}
<from action="./deleteTodo/" method="GET">
	<div class="input-qroup-item" name='todo1'>
    	<li class="list-group-item">{{ todo.content }}</li>
        <input type="hidden" id="todoNum" name="todoNum" value="{{ todo.id }}"> </input>
        <span ~~~> </span>
    </div>
{% endfor %}

- {% for todo in todos %}{% endfor %}

Django Template 중 for 문을 활용해 웹페이지에서 딕셔너리 불러오기.

해당 객체의 내용물이 몇개가 들었는 지도 모르고, 바뀌니까 for 문을 이용해 반복한다.

todos 라는 객체를 만들었고, 그 안의 내용들 하나하나를 todo 라는 이름으로 가져온다. todos 객체는 딕셔너리 타입으로 키-벨류를 가진

 

- {{ todo.content }}

사용자에게 보여지는 값. 

todo 데이터들 중 content 값을 불러온다.

 

- {{ todo.id }}

데이터의 id 값을 불러온다.

hidden 으로 불러왔고, 나중에 지우기 위한 마킹.

 

 

 

3. 상속

다른 템플릿을 확장해 기본 레이아웃을 정의, 특정 블럭을 불러와 중복을 줄이고 유지보수를 도움

 

<!-- base.html -->
<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}Default Title{% endblock %}</title>
</head>
<body>
    <div id="content">
        {% block content %}{% endblock %}
    </div>
</body>
</html>
<!-- child.html -->
{% extends "base.html" %}

{% block title %}Custom Title{% endblock %}

{% block content %}
    <h1>Hello, World!</h1>
{% endblock %}
# views.py
from django.shortcuts import render

def child_page(request):
    return render(request, 'child.html')

 

4. 필터

템플릿 변수에 특정 변환을 적용해 데이터의 형식을 지정 / 변환 하는데 도움을 줌

 

<!-- template.html -->
<p>The product price is: ${{ price|floatformat:2 }}</p>
# views.py
from django.shortcuts import render

def show_price(request):
    context = {
        'price': 123.4567,
    }
    return render(request, 'template.html', context)

 

5. 보안

csrf 보호기능을 불러와 보안을 강화한다.

 

<form method="post">
    {% csrf_token %}
    <!-- 폼 요소들과 버튼 등 추가 -->
</form>

 

 

일단 많이 봤던 Django Templates 몇개를 가져와봤다.

더 공부하면서 계속 추가 될 예정

'개념모음' 카테고리의 다른 글

MTV / MVC Pattern  (0) 2023.08.10
GET / POST  (0) 2023.08.06
Django 개념 모음  (0) 2023.07.28