Meme's IT

[Django] 로그인(5) 로그인 후, 페이지 다르게 출력하기 본문

BackEnd/Django

[Django] 로그인(5) 로그인 후, 페이지 다르게 출력하기

Memez 2023. 10. 5. 17:20

데코레이터 @login_required를 이용해서 새로운 글을 쓰는 create를 막아뒀을 때,

create → 로그인을 하면 create로 다음 페이지가 이어져야하는데

막상 해보면 메인페이지인 index로 넘어가게 된다.

 

 

그렇다면, login을 하게되는 경로에 따라 이후 페이지를 다르게 출력하려면 어떻게 해야할까?


# 방법1. input을 이용하기

login.html파일에서 form안에 input을 추가해준다.

<!-- login.html -->

<form action="{% url "accounts:login" %}" method="POST">
  {% csrf_token %}
  <input type="hidden" name="next" value="{{request.GET.next}}">
  {{ form.as_p }}
  <input type="submit">
</form>

이때, input의 type은 hidden으로 해서 보이지 않게 함

 

 

input태그는 POST방식으로 넘어가기 때문에 views.py에서 함수를 입력할 때는 POST로 조회를 한다.

# views.py 수정

def login(request):
    if request.method == 'POST':
        form = AuthenticationForm(request, request.POST)
        if form.is_valid():
            auth_login(request, form.get_user())
            next_url = request.POST.get('next')	# POST로 조회
            if next_url:
                return redirect(next_url)
            return redirect('articles:index')

 

 

# 방법2. form의 action이용하기

create → 로그인의 경로로 페이지를 넘어가면 다음과 같은 url을 가진다.

즉, 이후의 경로가 query형식으로 남는다.

이를 이용해서 form의 action을 이용해서 진행할 수 있다.

 

login.html을 다음과 같이 수정해준다.

<!-- login.html -->

<form action="{% url "accounts:login" %}?next={{request.GET.next}}" method="POST">
  {% csrf_token %}
  {{ form.as_p }}
  <input type="submit">
</form>

이때는 GET방식으로 조회를 해줘야한다.

그러므로 views.py에서 수정해준다.

# views.py 수정

def login(request):
    if request.method == 'POST':
        form = AuthenticationForm(request, request.POST)
        if form.is_valid():
            auth_login(request, form.get_user())
            next_url = request.GET.get('next')	# GET으로 변경
            if next_url:
                return redirect(next_url)

두가지 방법을 이용하면, 

그냥 로그인을 했을 때는 바로 메인페이지(index)로 넘어가고

create와 같이 login_required로 로그인을 진행했을 때는 막혔던 페이지로 넘어갈 수 있다.