MTV ν¨ν΄μμμ Template
Templateμ Django MTV(Model-Template-View) ν¨ν΄μμ μ¬μ©μμκ² λ³΄μ¬μ§λ UI λΆλΆμ λ΄λΉνλ μ»΄ν¬λνΈμ
λλ€.
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>© 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
볡μ¬