Search
Duplicate

Template

MTV νŒ¨ν„΄μ—μ„œμ˜ Template

Template은 Django MTV(Model-Template-View) νŒ¨ν„΄μ—μ„œ μ‚¬μš©μžμ—κ²Œ λ³΄μ—¬μ§€λŠ” UI 뢀뢄을 λ‹΄λ‹Ήν•˜λŠ” μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€.
HTMLκ³Ό Django Template Language(DTL)λ₯Ό μ‚¬μš©ν•˜μ—¬ 동적인 μ›Ή νŽ˜μ΄μ§€λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

Template의 μ£Όμš” νŠΉμ§•

β€’
HTML μ½”λ“œ μ•ˆμ— 파이썬 λ³€μˆ˜μ™€ λ‘œμ§μ„ μ‚½μž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€
β€’
μ½”λ“œ μž¬μ‚¬μš©μ„ μœ„ν•œ ν…œν”Œλ¦Ώ 상속 κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€
β€’
필터와 νƒœκ·Έλ₯Ό 톡해 데이터 좜λ ₯ ν˜•μ‹μ„ μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€

Template μ˜ˆμ‹œ μ½”λ“œ

1. κΈ°λ³Έ ν…œν”Œλ¦Ώ ꡬ쑰

<!-- base.html --> <!DOCTYPE html> <html> <head> <title>{% block title %}My Site{% endblock %}</title> </head> <body> <div class="content"> {% block content %} {% endblock %} </div> </body> </html>
HTML
볡사

2. ν…œν”Œλ¦Ώ 상속 μ˜ˆμ‹œ

<!-- home.html --> {% extends 'base.html' %} {% block title %}Home Page{% endblock %} {% block content %} <h1>Welcome, {{ user.username }}</h1> <ul> {% for item in items %} <li>{{ item.name }}</li> {% endfor %} </ul> {% endblock %}
HTML
볡사

3. View와 Template μ—°κ²°

# views.py from django.shortcuts import render def home_view(request): context = { 'user': request.user, 'items': Item.objects.all() } return render(request, 'home.html', context)
Python
볡사

Template 문법

κΈ°λŠ₯
문법
μ„€λͺ…
λ³€μˆ˜ 좜λ ₯
{{ variable }}
μ»¨ν…μŠ€νŠΈμ—μ„œ μ „λ‹¬λœ λ³€μˆ˜ 값을 좜λ ₯
ν•„ν„°
{{ variable|filter }}
λ³€μˆ˜ 값을 λ³€ν™˜ν•˜κ±°λ‚˜ ν¬λ§·νŒ…
μ œμ–΄λ¬Έ
{% if/for/while %}
쑰건문과 λ°˜λ³΅λ¬Έμ„ ν†΅ν•œ 둜직 처리
ν…œν”Œλ¦Ώ νƒœκ·Έ
{% tag_name %}
ν…œν”Œλ¦Ώ 상속, 포함 λ“± 특수 κΈ°λŠ₯ μˆ˜ν–‰

Django ν…œν”Œλ¦Ώ ν•„ν„° λͺ©λ‘

{{ variable|filter }}
ν•„ν„°
μ„€λͺ…
length
μ‹œν€€μŠ€μ˜ 길이 λ°˜ν™˜
lower
μ†Œλ¬Έμžλ‘œ λ³€ν™˜
upper
λŒ€λ¬Έμžλ‘œ λ³€ν™˜
capfirst
첫 κΈ€μžλ₯Ό λŒ€λ¬Έμžλ‘œ λ³€ν™˜
title
λͺ¨λ“  λ‹¨μ–΄μ˜ 첫 κΈ€μžλ₯Ό λŒ€λ¬Έμžλ‘œ λ³€ν™˜
truncatechars:N
λ¬Έμžμ—΄μ„ N자 μ΄ν•˜λ‘œ 잘라쀌
truncatewords:N
λ¬Έμžμ—΄μ„ N단어 μ΄ν•˜λ‘œ 잘라쀌
linebreaksbr
μ€„λ°”κΏˆμ„ <br>둜 λ³€ν™˜
linebreaks
μ€„λ°”κΏˆμ„ <p>와 <br>둜 λ³€ν™˜
striptags
HTML νƒœκ·Έ 제거
safe
HTML을 μ΄μŠ€μΌ€μ΄ν”„ν•˜μ§€ μ•Šκ³  좜λ ₯
default:"κ°’"
값이 λΉ„μ–΄ μžˆμ„ λ•Œ κΈ°λ³Έκ°’ μ‚¬μš©
default_if_none:"κ°’"
값이 None일 λ•Œ κΈ°λ³Έκ°’ μ‚¬μš©
date:"ν˜•μ‹"
λ‚ μ§œ 포맷 μ§€μ • (Y-m-d, D d M Y λ“±)
time:"ν˜•μ‹"
μ‹œκ°„ 포맷 μ§€μ •
timesince
μ‹œκ°„ μ°¨λ₯Ό μ‚¬λžŒ 읽기 μ‰¬μš΄ ν˜•μ‹μœΌλ‘œ ν‘œμ‹œ
add:N
μˆ«μžμ— N 더함
divisibleby:N
N으둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ”μ§€ 확인
join:"κ΅¬λΆ„μž"
리슀트λ₯Ό λ¬Έμžμ—΄λ‘œ μ—°κ²°
yesno:"예,μ•„λ‹ˆμ˜€"
λΆˆλ¦¬μ–Έ 값을 μ§€μ •ν•œ λ¬Έμžμ—΄λ‘œ λ³€ν™˜
filesizeformat
λ°”μ΄νŠΈ 값을 읽기 μ‰¬μš΄ 파일 크기둜 λ³€ν™˜
pluralize
단어 뒀에 λ³΅μˆ˜ν˜•μ„ μžλ™μœΌλ‘œ λΆ™μž„ (s λ“±)

1. λ³€μˆ˜ 좜λ ₯

{{ variable_name }}
HTML
볡사
λ³€μˆ˜μ˜ 값을 ν…œν”Œλ¦Ώμ— 좜λ ₯ν•©λ‹ˆλ‹€. Viewμ—μ„œ μ „λ‹¬λœ context λ”•μ…”λ„ˆλ¦¬μ˜ 킀에 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2. ν•„ν„°

{{ variable|lower }} {{ variable|length }} {{ variable|date:"Y-m-d" }}
HTML
볡사
νŒŒμ΄ν”„(|) 문자λ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜μ˜ 좜λ ₯ ν˜•μ‹μ„ λ³€κ²½ν•˜κ±°λ‚˜ 가곡할 수 μžˆμŠ΅λ‹ˆλ‹€. μ—¬λŸ¬ ν•„ν„°λ₯Ό μ²΄μ΄λ‹ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3. μ œμ–΄λ¬Έ

β€’
if
β€’
for
β€’
while

if λ¬Έ

{% if user.is_authenticated %} <p>ν™˜μ˜ν•©λ‹ˆλ‹€, {{ user.username }}!</p> {% else %} <p>둜그인이 ν•„μš”ν•©λ‹ˆλ‹€.</p> {% endif %}
HTML
볡사
쑰건에 따라 λ‹€λ₯Έ λ‚΄μš©μ„ 좜λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. else와 elif도 μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€.

for λ¬Έ

{% for item in items %} <li>{{ item.name }}</li> {% empty %} <li>ν•­λͺ©μ΄ μ—†μŠ΅λ‹ˆλ‹€.</li> {% endfor %}
HTML
볡사
λ¦¬μŠ€νŠΈλ‚˜ μΏΌλ¦¬μ…‹μ˜ 각 ν•­λͺ©μ„ λ°˜λ³΅ν•˜μ—¬ 좜λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. empty νƒœκ·Έλ‘œ λ¦¬μŠ€νŠΈκ°€ λΉ„μ–΄μžˆμ„ λ•Œμ˜ μ²˜λ¦¬λ„ κ°€λŠ₯ν•©λ‹ˆλ‹€.

while λ¬Έ

{% with value=5 %} {% while value > 0 %} <p>μΉ΄μš΄νŠΈλ‹€μš΄: {{ value }}</p> {% with value=value|add:"-1" %} {% endwhile %} {% endwith %}
HTML
볡사
쑰건이 참인 λ™μ•ˆ λ°˜λ³΅ν•˜μ—¬ 좜λ ₯ν•©λ‹ˆλ‹€. Django κΈ°λ³Έ ν…œν”Œλ¦Ώ νƒœκ·Έμ—λŠ” μ—†μœΌλ©°, μ»€μŠ€ν…€ ν…œν”Œλ¦Ώ νƒœκ·Έλ‘œ κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.

4. ν…œν”Œλ¦Ώ νƒœκ·Έ

{% extends "base.html" %} {% include "navbar.html" %} {% url 'view-name' arg1 arg2 %} {% csrf_token %} {% load static %}
HTML
볡사
ν…œν”Œλ¦Ώμ˜ ꡬ쑰λ₯Ό μ œμ–΄ν•˜κ³  νŠΉλ³„ν•œ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λŠ” νƒœκ·Έλ“€μž…λ‹ˆλ‹€. ν…œν”Œλ¦Ώ 상속, λ‹€λ₯Έ ν…œν”Œλ¦Ώ 포함, URL 생성, λ³΄μ•ˆ 토큰 생성, 정적 파일 λ‘œλ“œ λ“±μ˜ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

λͺ¨λ²” 사둀

β€’
ν…œν”Œλ¦Ώ νŒŒμΌμ€ μ•± 디렉토리 λ‚΄μ˜ templates 폴더에 μ €μž₯
β€’
μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈλŠ” λ³„λ„μ˜ ν…œν”Œλ¦Ώ 파일둜 뢄리
β€’
λ³΅μž‘ν•œ λ‘œμ§μ€ viewμ—μ„œ μ²˜λ¦¬ν•˜κ³  ν…œν”Œλ¦Ώμ€ 좜λ ₯에 집쀑
β€’
ν…œν”Œλ¦Ώ 상속을 ν™œμš©ν•˜μ—¬ μ½”λ“œ 쀑볡 μ΅œμ†Œν™”
μ΄λŸ¬ν•œ Template μ‹œμŠ€ν…œμ„ 톡해 DjangoλŠ” 효율적이고 μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•œ ν”„λ‘ νŠΈμ—”λ“œ κ°œλ°œμ„ μ§€μ›ν•©λ‹ˆλ‹€.

Template을 ν™œμš©ν•œ λ ˆμ΄μ•„μ›ƒ μž¬μ‚¬μš©

Django Template μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•˜μ—¬ header, content, footer와 같은 곡톡 λ ˆμ΄μ•„μ›ƒμ„ 효율적으둜 μž¬μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

1. κΈ°λ³Έ λ ˆμ΄μ•„μ›ƒ ν…œν”Œλ¦Ώ 생성

<!-- templates/base.html --> <!DOCTYPE html> <html> <head> <title>{% block title %}{% endblock %}</title> </head> <body> <header> {% block header %} <!-- 곡톡 헀더 λ‚΄μš© --> <nav> <ul> <li><a href="/">Home</a></li> <li><a href="/about">About</a></li> </ul> </nav> {% endblock %} </header> <main> {% block content %} <!-- 각 νŽ˜μ΄μ§€λ³„ 컨텐츠가 λ“€μ–΄κ°ˆ 자리 --> {% endblock %} </main> <footer> {% block footer %} <!-- 곡톡 ν‘Έν„° λ‚΄μš© --> <p>&copy; 2025 My Website</p> {% endblock %} </footer> </body> </html>
HTML
볡사

2. λ ˆμ΄μ•„μ›ƒ 상속 μ˜ˆμ‹œ

<!-- templates/home.html --> {% extends "base.html" %} {% block title %}ν™ˆνŽ˜μ΄μ§€{% endblock %} {% block content %} <h1>ν™˜μ˜ν•©λ‹ˆλ‹€!</h1> <p>이 곳에 νŽ˜μ΄μ§€λ³„ κ³ μœ ν•œ 컨텐츠가 λ“€μ–΄κ°‘λ‹ˆλ‹€.</p> {% endblock %}
HTML
볡사
μ΄λŸ¬ν•œ ꡬ쑰λ₯Ό 톡해 header와 footerλŠ” λͺ¨λ“  νŽ˜μ΄μ§€μ—μ„œ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•˜λ©΄μ„œ, content μ˜μ—­λ§Œ νŽ˜μ΄μ§€λ³„λ‘œ λ‹€λ₯΄κ²Œ ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ ν•„μš”ν•œ 경우 각 블둝을 κ°œλ³„μ μœΌλ‘œ μ˜€λ²„λΌμ΄λ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ ˆμ΄μ•„μ›ƒ μž¬μ‚¬μš©μ˜ μž₯점

β€’
μ½”λ“œ 쀑볡을 μ΅œμ†Œν™”ν•˜μ—¬ μœ μ§€λ³΄μˆ˜κ°€ 용이
β€’
μ‚¬μ΄νŠΈ μ „μ²΄μ˜ μΌκ΄€λœ λ””μžμΈ μœ μ§€ κ°€λŠ₯
β€’
곡톡 μš”μ†Œ μˆ˜μ • μ‹œ ν•œ 곳만 λ³€κ²½ν•˜λ©΄ 전체 적용
β€’
각 νŽ˜μ΄μ§€λ³„ μ»€μŠ€ν„°λ§ˆμ΄μ§• μœ μ—°μ„± 제곡

humanize

Django의 humanizeλŠ” μˆ«μžλ‚˜ λ‚ μ§œλ₯Ό μ‚¬λžŒμ΄ 읽기 μ‰¬μš΄ μžμ—°μ–΄ ν˜•νƒœλ‘œ ν‘œμ‹œν•΄μ£ΌλŠ” ν…œν”Œλ¦Ώ ν•„ν„° λͺ¨μŒμž…λ‹ˆλ‹€. μ•„λž˜λŠ” humanizeλ₯Ό ν™œμ„±ν™”ν•˜κ³  μ‚¬μš©ν•˜λŠ” 방법, 그리고 ν•„ν„° μ •λ¦¬ν‘œμž…λ‹ˆλ‹€.

1. humanize μ‚¬μš© μ€€λΉ„

1단계. μ•± μ„€μ •:
INSTALLED_APPS에 'django.contrib.humanize' μΆ”κ°€:
INSTALLED_APPS = [ ... 'django.contrib.humanize', ]
Python
볡사
2단계. ν…œν”Œλ¦Ώμ—μ„œ λ‘œλ“œ:
ν…œν”Œλ¦Ώ 상단에 ν•„ν„° λ‘œλ”© μ„ μ–Έ:
{% load humanize %}
Plain Text
볡사

2. humanize ν•„ν„° μ •λ¦¬ν‘œ

ν•„ν„°
μ„€λͺ…
intcomma
천 λ‹¨μœ„ 콀마 μΆ”κ°€ (1000000 β†’ 1,000,000)
intword
숫자λ₯Ό λ‹¨μœ„λ‘œ λ³€ν™˜ (1000000 β†’ 1.0 million)
apnumber
1~9λ₯Ό μ˜μ–΄ 철자둜 ν‘œμ‹œ (1 β†’ one)
naturalday
였늘, μ–΄μ œ, λ‚ μ§œλ‘œ ν‘œν˜„
naturaltime
μ§€κΈˆ κΈ°μ€€ μƒλŒ€μ  μ‹œκ°„ (3 minutes ago)
ordinal
μ„œμˆ˜λ‘œ ν‘œμ‹œ (1 β†’ 1st, 2 β†’ 2nd)
naturaldate
λ‚ μ§œλ₯Ό μžμ—°μ–΄λ‘œ (μž₯κ³  4.0+)
floatformat
μ†Œμˆ˜μ  자리수 μ œν•œ (`{{ value

μ‚¬μš© μ˜ˆμ‹œ

{% load humanize %} <p>쑰회수: {{ post.views|intcomma }}</p> <p>μ—…λ‘œλ“œ: {{ post.created_at|naturaltime }}</p> <p>μš©λŸ‰: {{ file.size|intword }}</p> <p>μ„œμˆ˜: {{ forloop.counter|ordinal }}</p>
Plain Text
볡사