λ©μμ§ νλ μμν¬ κ°μμλ£
1. λ©μμ§ νλ μμν¬λ?
Djangoμμ flash messageλ₯Ό ꡬννλ λ°©λ².
μμ²κ³Ό μλ΅ μ¬μ΄μ ν λ²μ± λ©μμ§λ₯Ό μ μ₯νκ³ , ν
νλ¦Ώμμ νμν©λλ€.
Django λ©μμ§ νλ μμν¬λ μ¬μ©μμκ² μλ¦Ό λ©μμ§λ₯Ό 보μ¬μ€ λ μ μ©ν κΈ°λ₯μ
λλ€. μλ₯Ό λ€μ΄ νμκ°μ
/λ‘κ·ΈμΈ μ±κ³΅, μ€λ₯ μλ΄ λ± λ€μν μν©μμ νμ©λ©λλ€.
2. μ¬μ© μ€λΉ
settings.py
# κΈ°λ³Έμ μΌλ‘ ν¬ν¨λμ΄ μμ (νμΈλ§ νλ©΄ λ¨)
'django.contrib.messages',
Python
볡μ¬
Middleware μ€μ
# κΈ°λ³Έμ μΌλ‘ ν¬ν¨λμ΄ μμ
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
Python
볡μ¬
Template context processor νμΈ
# settings.pyμ TEMPLATES > OPTIONS > context_processors
'django.contrib.messages.context_processors.messages',
Python
볡μ¬
3. λ©μμ§ μ¬μ© λ°©λ²
views.py
from django.contrib import messages
from django.shortcuts import redirect
def sample_view(request):
messages.success(request, 'μ±κ³΅μ μΌλ‘ μ²λ¦¬λμμ΅λλ€.')
messages.error(request, 'μ€λ₯κ° λ°μνμ΅λλ€.')
messages.warning(request, 'μ£Όμκ° νμν©λλ€.')
messages.info(request, 'μ λ³΄μ± λ©μμ§μ
λλ€.')
return redirect('home')
Python
볡μ¬
4. ν
νλ¦Ώμ λ©μμ§ νμ
templates/base.html μμ
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li class="{{ message.tags }}">{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
HTML
볡μ¬
Bootstrap μ μ© μμ
{% for message in messages %}
<div class="alert alert-{{ message.tags }}">
{{ message }}
</div>
{% endfor %}
HTML
볡μ¬
5. μ€μ΅: νμκ°μ
ν λ©μμ§ λ³΄μ¬μ£ΌκΈ°
views.py
from django.contrib import messages
from django.shortcuts import render, redirect
from .forms import CustomUserCreationForm
def signup(request):
if request.method == "POST":
form = CustomUserCreationForm(request.POST)
if form.is_valid():
form.save()
messages.success(request, "νμκ°μ
μ΄ μλ£λμμ΅λλ€. λ‘κ·ΈμΈν΄μ£ΌμΈμ.")
return redirect('login')
else:
messages.error(request, "μ
λ ₯κ°μ λ€μ νμΈν΄μ£ΌμΈμ.")
else:
form = CustomUserCreationForm()
return render(request, "accounts/signup.html", {"form": form})
Python
볡μ¬
6. λ©μμ§ μμ€(Level)
λ©μμ§ | ν¨μ | message.tags κ° |
μ±κ³΅ | messages.success() | success |
μ€λ₯ | messages.error() | danger |
κ²½κ³ | messages.warning() | warning |
μ 보 | messages.info() | info |
λλ²κ·Έ | messages.debug() | debug |
7. μ 리
β’
λ©μμ§ νλ μμν¬λ ν λ²μ± μ¬μ©μ μλ¦Όμ μ ν©
β’
views.pyμμ messages.add() νκ³ , ν
νλ¦Ώμμ for message in messages
β’
Bootstrapκ³Ό ν¨κ» νμ©νλ©΄ μκ°μ μΌλ‘ κΉλν μλ¦Ό ꡬν κ°λ₯
Bootstrap λ©μμ§ ν
νλ¦Ώ μμ
Bootstrapκ³Ό ν¨κ» μ¬μ©νλ Django λ©μμ§ ν
νλ¦Ώ μμμ
λλ€. λ©μμ§μ μ’
λ₯μ λ°λΌ Bootstrap κ²½κ³ (alert) ν΄λμ€λ₯Ό μ μ©ν΄ μ¬μ©μμκ² μκ°μ μΌλ‘ μλ¦Όμ μ λ¬ν μ μμ΅λλ€.
templates/base.html
base.html ν
νλ¦Ώμ΄λ λ©μμ§λ₯Ό μΆλ ₯νκ³ μΆμ ν
νλ¦Ώμ μλ μ½λ μ½μ
{% if messages %}
{% for message in messages %}
<div class="alert alert-{{ message.tags }} alert-dismissible fade show mt-3" role="alert">
{{ message }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
{% endfor %}
{% endif %}
HTML
볡μ¬
κ²°κ³Ό μμ
Django λ©μμ§ ν¨μ | Bootstrap ν΄λμ€ μμ (message.tags) | λ©μμ§ μμ |
messages.success() | alert-success | μ΄λ‘ (μ±κ³΅) |
messages.error() | alert-danger | λΉ¨κ° (μλ¬) |
messages.warning() | alert-warning | λ
Έλ (κ²½κ³ ) |
messages.info() | alert-info | νλ (μ 보) |
Bootstrap 5μ© μ€ν¬λ¦½νΈκ° μμ΄μΌ μλν©λλ€
ν
νλ¦Ώμ Bootstrap JSκ° ν¬ν¨λμ΄ μμ΄μΌ btn-closeλ‘ μλ¦Ό λ«κΈ°κ° μλν©λλ€.
<!-- Bootstrap 5 JS CDN (base.html νλ¨μ λ£κΈ°) -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
HTML
볡μ¬
ν
μ€νΈμ© λ·° ν¨μ μμ
from django.contrib import messages
from django.shortcuts import redirect
def test_message(request):
messages.success(request, 'μ±κ³΅ λ©μμ§μ
λλ€!')
messages.warning(request, 'κ²½κ³ λ©μμ§μ
λλ€!')
messages.error(request, 'μλ¬ λ©μμ§μ
λλ€!')
messages.info(request, 'μ 보 λ©μμ§μ
λλ€!')
return redirect('home')
Python
볡μ¬
λ©μμ§ μλ μ¬λΌμ§κΈ° μ€μ (μ: 3μ΄ ν)
Django λ©μμ§λ₯Ό BootstrapμΌλ‘ μΆλ ₯ν λ μλμΌλ‘ μΌμ μκ° λ€ μ¬λΌμ§κ² νκ³ μΆλ€λ©΄, JavaScriptμ setTimeout()μ μ΄μ©νλ©΄ λ©λλ€.
ν
νλ¦Ώ μ½λ (μ: base.html)
{% if messages %}
<div id="django-messages">
{% for message in messages %}
<div class="alert alert-{{ message.tags }} alert-dismissible fade show mt-3" role="alert">
{{ message }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
{% endfor %}
</div>
<script>
// 3μ΄(3000ms) ν λ©μμ§ μλ λ«ν
setTimeout(function() {
const alerts = document.querySelectorAll('#django-messages .alert');
alerts.forEach(function(alert) {
// Bootstrap 5μμ μ 곡νλ λ«κΈ° μ²λ¦¬
const bsAlert = bootstrap.Alert.getOrCreateInstance(alert);
bsAlert.close();
});
}, 3000);
</script>
{% endif %}
HTML
볡μ¬
μ£Όμμ¬ν
β’
Bootstrap 5μ JSκ° λ°λμ ν¬ν¨λμ΄ μμ΄μΌ ν©λλ€:
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
HTML
볡μ¬
β’
3000 κ°μ μνλ μκ°(ms)μΌλ‘ λ³κ²½νλ©΄ λ©λλ€ (μ: 5μ΄λ©΄ 5000).