티스토리 뷰

반응형

0. 들어가기전에

else로 분기하여 사용가능한 것들이 있다.

  1. 메세지 프레임워크를 사용하여 메인페이지로 이동
  2. 403 status code를 반환

 

alert기능 구현하기

 

공식사이트

검색) django messages framework (= flash message)

https://docs.djangoproject.com/en/3.0/ref/contrib/messages/

 

The messages framework | Django documentation | Django

The Django Software Foundation deeply values the diversity of our developers, users, and community. We are distraught by the suffering, oppression, and systemic racism the Black community faces every day. We can no longer remain silent. In silence, we are

docs.djangoproject.com

일회성 알림 메세지로 flash message라고도 한다. 왜냐하면 한번 알리고 새로고침 하면 없어진다.

즉, 임시적으로 메세지 알려준다.

읽어보면 one-titme notification message(한번만 알려준다)이다.

쿠키와 세션으로 나누어진다.

 

위의 내용을 보면 startproject하면 이제 포함 되어 있다고 말해준다.

settings에 미리 다 포함 시켜 놨다.

 

구현

기본적으로 bootstrap4가 설치.

settings.py

아래 부분의 다음 내용을 추가하자

MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'

cookie가 기본값인데 우리는 session으로 쓰겠다는 설정이다.

 

 

views.py

from django.contrib import messages

messages.warning(request, 'Your account expires in three days.')

 

 

 

예시 코드

사실 이렇게 적어도 뜬다. 

 

이때 주의 할 점은 redirect하면 처음부터 돌아가기 때문에 안뜬다. render해서 바로 html로 이동하기 때문에 messageframework가 뜬다.


종류는 아래와 같다

messages.debug(request, '%s SQL statements were executed.' % count)

messages.info(request, 'Three credits remain in your account.')

messages.success(request, 'Profile details updated.')

messages.warning(request, 'Your account expires in three days.')

messages.error(request, 'Document deleted.')


 

html

특정html에 적는 것 보단, base.html에 적는 것이 편하다.

추가적으로 하려면 하래 처럼 적어서 필요한 부분을 확인하면된다.

{% if messages %}

<ul class="messages">

    {% for message in messages %}

    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>

    {% endfor %}

</ul>

{% endif %}

 

이렇게 적어준다.

 

 

 

여기서 더 이쁘게 하기 위해서는 bootstrap를 추가해 주면 된다.

bootstrap의 

<div class="alert alert-primary" role="alert">

    This is a primary alert—check it out!

</div>

과 위의 코드를 결합해보자.

 

최종 코드(+bootstrap)

{% if messages %}

<div class="messages">

    {% for message in messages %}

    <div class="alert alert-{% if message.tag %}{{ message.tags }}{% endif %}" role="alert">

        {{ message }}

    </div>

    {% endfor %}

</div>

 

위의 messages를 import 선언 없이 쓸 수 있는 이유는 settings -> templates -> options -> context_processors가 html에서 기본적으로 쓸 수 있는 것들을 정의한 것 들이다. 4번째 줄은 messages를 변수로 그냥 쓸 수 있게 하는 거라고 이해하면 된다.

 

ex) 댓글 부분 메세지 프레임 워크 넣기

 

settings.py

MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'

 

base.html

    {% if messages %}

        {% for message in messages %}

        <div{% if message.tags %} class="alert alert-{{ message.tags }}"{% endif %}>{{ message }}</div>

        {% endfor %}

    {% endif %}

 

views.py

@require_POST

def comments_create(requestpk):

    if request.user.is_authenticated:

        article = get_object_or_404(Article, pk=pk)

        form = CommentForm(request.POST)

        if form.is_valid():

            comment = form.save(commit=False)

            comment.user = request.user

            comment.article = article

            comment.save()

        return redirect('articles:detail', article.pk)

    else:

        messages.warning(request, '댓글 작성을 위해서는 로그인이 필요합니다.')

        return redirect('accounts:login')

 

 


상태코드 보여주기

우리가 반환해야 하는 것은 response object 하나이다. response object를 반환하기 위해서는 render, redirect 뿐만아니라도 반환 할 수 있는 다양한 객체들이 존재한다. 즉, 상태코드를 보여주기도 가능하다.

 

400 잘못된 요청
401 권한 없음(로그인 x)
402 결제 필요
403 필요 권한이 없음(관리자 권한이 없음)

https://docs.djangoproject.com/en/3.0/ref/request-response/

 

Request and response objects | Django documentation | Django

The Django Software Foundation deeply values the diversity of our developers, users, and community. We are distraught by the suffering, oppression, and systemic racism the Black community faces every day. We can no longer remain silent. In silence, we are

docs.djangoproject.com

 

위의 사이트 들어가서 위의 캡쳐 부분을 읽어보자.

 

우리는 403 에러를 보여주면서 권한이 없다는 걸 알려줘 보자.

코드는 간단하다.

views.py

~

~
~

else:

    from djang.http import HttpResponseForbidden

    return HttpResponseForbiden()

 

만약 401에러를 보여주고 싶다면, 401은 위의 객체처럼 사용가능한 것이 없기 떄문에 아래와 같이 작성한다

 

else:

    from djang.http import HttpResponse

    return HttpResponse(status=401)

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함