Search

λ©”μ‹œμ§€ ν”„λ ˆμž„μ›Œν¬

λ©”μ‹œμ§€ ν”„λ ˆμž„μ›Œν¬ κ°•μ˜μžλ£Œ

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
볡사
message.tags β†’ success, error, warning λ“±μ˜ λΆ€νŠΈμŠ€νŠΈλž© ν΄λž˜μŠ€μ™€ μ—°κ²° κ°€λŠ₯

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).