Django Messages Framework
2022. 1. 24. 16:32ㆍ강의 정리/Django Form
반응형
장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!
Messages Framework
- 현재 User를 위한 1회성 메세지를 담는 용도
- ex) "저장했습니다.", "로그인 성공하였습니다"
- HttpRequest 인스턴스를 통해 메세지를 남긴다.
- 그 말인 즉슨 View에서만 사용할 수 있다.
- 메세지는 1회 노출이 되고 사라진다.
- View를 통한 템플릿 시스템을 통해 노출하며, 템플릿 내에서 JavaScript(toast UI)를 통한 노출도 가능하다.
- 비 SPA 방식에서 주로 이용된다.
Message Levels를 통한 메세지 분류
- 파이썬 로깅 모듈의 Level을 차용
- 레벨에 따라 로깅 여부 판단
- 혹은 템플릿에서 다른 스타일로 노출
- 레벨 종류
- DEBUG : 디폴트 설정으로 무시되는 레벨
- 개발 관련된 메세지이며, 실 서비스에서는 무시
- INFO : 해당 유저에 대한 정보성 메세지
- SUCCESS : 액션이 성공적으로 수행되었음을 알림
- WARNING : 실패가 아직 발생하지는 않았지만, 임박했을 때
- ERROR : 액션이 수행되지 않았거나, 다른 Failure가 발생했을 때
- DEBUG : 디폴트 설정으로 무시되는 레벨
messages 등록 코드
from django.contrib import messages
def post_new(request):
if form.is_valid():
post = form.save()
# 방법 1
messages.add_message(request, messages.SUCCESS, '새 글이 성공적으로 등록 되었습니다.')
# 방법 2
messages.success(request, '새 글이 등록 되었습니다.')
return redirect(post)
- message는 등록을 여러번 할 수있고, 등록할 때 리스트에 저장이 된다.
- message를 소비할 때 리스트에 저장된 모든 message가 한번에 소비하게 된다.
messages 소비 #주로 템플릿을 통해서 소비
- messages context_processors를 통해서 messages 목록에 접근
- context_processors란
- 템플릿 기본 로딩 변수 목록을 생성해주는 함수 목록
- https://itinerant.tistory.com/22
- .tags 속성을 통해서 레벨을 제공
- .messages 속성을 통해 내용을 제공 (=str(message))
- context_processors란
{% if messgaes %}
<ul class="messages">
{% for message in messages %}
<li>
[{{ messages.tags }}] {{ message.message }}
</li>
{% endfor %}
</ul>
{% endif %}
출력 tags 변경하기
#settings.py
from django.contrib.messages import constants as messages_contants
MESSAGE_TAGS = {
messages_contants.DEBUG: 'secondary',
messages_contants.ERROR: 'danger',
}
부트스트랩을 이용한 messages 실습
#instagram/views.py
@login_required
def post_new(request):
"""
중략
"""
if form.is_valid():
post = form.save(commit=False)
post.author = request.user # 현재 로그인한 유저 Instance
post.save()
messages.success(request, '포스팅을 저장했습니다.')
return redirect(post)
"""
중략
"""
})
- 메세지 등록 코드는 view에 작성한다.
#instagram/layout.html
<body>
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
<div class="collapse navbar-collapse" id="navbarsExampleDefault">
</div>
</nav>
<div class="container">
<div class="row">
<div class="col-sm-12">
{% if messages %}
<div class="messages">
{% for message in messages %}
<div class="alert alert-info">
{{ message.message }}
{{ message.tags }}
</div>
{% endfor %}
</div>
{% endif %}
{% block content %}
{% endblock content %}
<hr/>
© Dongbaek
</div>
</div>
</div>
</body>
- 메세지 소비 코드는 한 곳에 일괄적을 작성하는게 편하다.
#instagram/post_form.html
{% extends "instagram/layout.html" %}
{% load bootstrap4 %}
{% block content %}
<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
{% bootstrap_form form %}
{% buttons %}
<button class="btn btn-primary">
저장
</button>
{% endbuttons %}
</form>
<hr/>
{% if post %}
<a href="{{ post.get_absoulte_url }}" class="btn btn-primary">
내용으로
</a>
{% endif %}
<a href="{% url 'instagram:post_list' %}" class="btn btn-info">
목록
</a>
{% endblock %}
도움 받은 문서
- https://greeksharifa.github.io/%ED%8C%8C%EC%9D%B4%EC%8D%AC/2019/12/13/logging/
- https://marshall-ku.tistory.com/307
- https://itinerant.tistory.com/22
반응형
'강의 정리 > Django Form' 카테고리의 다른 글
Django 빌트인 CBV를 통한 Form 처리 (0) | 2022.01.24 |
---|---|
Django Form 삭제 구현! (0) | 2022.01.24 |
Django Form Validation (0) | 2022.01.19 |
Django ModelForm이란? (0) | 2022.01.19 |
Django Cross Site Request Forgery이란??? (0) | 2022.01.18 |