1 개요편집
웹사이트에서 살짝 나타났다가 사라지는 메시지. 1회성 알림 메시지 기능이 이미 장고 안에 포함되어 있다.
1.1 용도편집
- 새로운 페이지로 리다이렉션 할 때 뭔가 메시지를 남기려면 일일이 render를 사용해야 하는데, 리다이렉트 하는 주소가 달라질 수 있다.(삭제 후 학교게시판 링크를 써야 할지, 일반 게시판 링크로 보내야 할지 모를 때 단순히 이전 링크로 돌려보내면서 메시지를 보내고 싶을 때.) 그런 때에도 메시지를 일관적으로 보낼 수 있다.
2 기초 사용편집
과정 | 설명 | 코드 | ||||||
---|---|---|---|---|---|---|---|---|
settings.py 수정 | 메시지를 쿠키에서 사용할 것이냐, 세션에서 사용할 것이냐를 지정해준다.
우측 코드 중 하나를 적절한 위치에 추가하면 된다. |
| ||||||
뷰 수정 | 실제로 사용할 뷰를 수정해준다.
render 이전에 지정해주면 된다. request와 메시지를 인수로 넣어주면 된다.
(코드에서 사용할 땐 소문자로 입력해준다.)
|
from django.contrib import messages # 메시지 모듈을 불러오고,
def view...(request):
...
messages.info(request, "비밀번호는 단방향 암호화 되어 보관됩니다.(관리자도 해독을 못한다는 사실!)")
return render(request, 'custom_account/signup.html', {'form': form})
| ||||||
탬플릿 수정 | 메세지는 {{ messages }} 안에 담기는데,
메시지는 대부분 모든 페이지에서 쓰이므로 base.html에 작성하는 편이 좋다. |
{% if messages %}
{% for message in messages %}
{% if message.tags %}<li >{{ message }}</li>{% endif %}
{% endfor %}
|
3 더 나아가기편집
3.1 부트스트랩편집
https://devlog.jwgo.kr/2020/10/17/fancy-messaging-system-in-django/를 참고하였다.
과정 | 설명 | 코드 |
---|---|---|
탬플릿 수정 | 클래스 안에 메시지 태그를 답는다. | {% for message in messages %}
<div class="alert {{ message.tags }} alert-auto-dismissible alert-dismissible notification-container text-center" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
{{ message }}
</div>
{% endfor %}
|
settings.py 수정 | 메시지 태그가 부트스트랩과 일치하리라 기대하긴 어렵고.. settings에서 지정해준다.
|
from django.contrib import messages # 메시지를 임포트하는 것도 필요.
MESSAGE_TAGS = {
messages.DEBUG: 'alert-info',
messages.INFO: 'alert-info',
messages.SUCCESS: 'alert-success',
messages.WARNING: 'alert-warning',
messages.ERROR: 'alert-danger',
}
|
추가 | 위까지 진행하면 x를 눌러야 사라지는 메시지가 나타나지만, 직접 클릭하지 않고 지워져야 세련된 메시지라 할 수 있을 것이다.
우측 자바스크립트 코드를 탬플릿에 추가하자. |
<script>
window.setTimeout(function() {
$(".alert-auto-dismissible").fadeTo(500, 0).slideUp(500, function(){
$(this).remove();
});
}, 4000); // 초는 여기!
</script>
|
4 관련에러편집
4.1 TypeError: 'int' object is not callable편집
코드 내에서 사용할 때 messages.WARNING
처럼 대문자로 사용해서 그렇다. messages.warning
처럼 입력해보자.