Django Messages Framework

2022. 1. 24. 16:32강의 정리/Django Form

반응형

출처 : https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard

 

장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!

 

 


Messages Framework

  • 현재 User를 위한 1회성 메세지를 담는 용도
    • ex) "저장했습니다.", "로그인 성공하였습니다"
  • HttpRequest 인스턴스를 통해 메세지를 남긴다.
    • 그 말인 즉슨 View에서만 사용할 수 있다.
  • 메세지는 1회 노출이 되고 사라진다.
  • View를 통한 템플릿 시스템을 통해 노출하며, 템플릿 내에서 JavaScript(toast UI)를 통한 노출도 가능하다.
  • 비 SPA 방식에서 주로 이용된다.
 

[자바스크립트] 토스트 메시지 띄우기

클릭해보세요 말 그대로 토스트 기계에서 토스트 구운 것처럼 툭 튀어 올라왔다 내려가는 팝업입니다. 특정 버튼을 클릭하는 등 무슨 동작을 했을 때 변경 점을 직관적으로 알려주기 좋다고 생

marshall-ku.tistory.com

 

 


Message Levels를 통한 메세지 분류

  • 파이썬 로깅 모듈의 Level을 차용
  • 레벨에 따라 로깅 여부 판단
    • 혹은 템플릿에서 다른 스타일로 노출
  • 레벨 종류
    • DEBUG : 디폴트 설정으로 무시되는 레벨
      • 개발 관련된 메세지이며, 실 서비스에서는 무시
    • INFO : 해당 유저에 대한 정보성 메세지
    • SUCCESS : 액션이 성공적으로 수행되었음을 알림
    • WARNING : 실패가 아직 발생하지는 않았지만, 임박했을 때
    • ERROR : 액션이 수행되지 않았거나, 다른 Failure가 발생했을 때

 


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란 
    • .tags 속성을 통해서 레벨을 제공
    • .messages 속성을 통해 내용을 제공 (=str(message))

 

{% 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/>
                  &copy; 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 %}

 

 

 

 


 

도움 받은 문서

 

 

반응형

'강의 정리 > 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