출처: https://meyouus.tistory.com/64 [정보 공유 - For Me For You For Us]
본문으로 바로가기

우리가 흔히 다른 웹사이트를 사용할 때 이런 경험이 있을 것이다:

  1. 특정 페이지(A)에 들어가려고 한다
  2. 로그인이 되어 있지 않으므로 웹사이트에서 바로 로그인 페이지로 redirect한다.
  3. 로그인을 한다
  4. 로그인 후 원래 가려던 페이지(A)로 바로 redirect 된다.

하지만 우리가 Django를 쓰면서 이를 따로 구현해주지 않으면 로그인 페이지로 redirect 되었을 때, 그리고 그 후 로그인을 한다면 바로 로그인 후 redirect하게 되어있는 페이지로 옮겨진다. 즉, A 페이지로는 redirect가 안된다. 이번에는 이 방식을 한번 구현해보겠다.


html template 수정하기

<!-- login.html -->
{% extends 'base.html' %}

{% block content %}
    <form class="site-form" action="" method="POST">
        {% csrf_token %}
        {{ form }}
        {% if request.GET.next %}
            <input type="hidden" name="next" value="{{ request.GET.next }}">
        {% endif %}
        <input type="submit" value="Login">
    </form>
{% endblock %}

우선 여기서 request.GET.next를 볼 수 있다. 이는 다음을 살펴보자:

여기 주소창을 보면 ?next=/articles/create/ 라고 되어 있는 부분을 볼 수 있다. 그 뜻은, 로그인 후 바로 /articles/create/' 페이지로 가게끔 설정한 것이다. 따라서, 현재의login.html에서next라고 되어 있는 부분이 있다면, 이 부분이 안보이게끔 설정한 후,form에 저장을 시켜준다. 이후,views.py`에서 이를 가지고 어떻게 할지 정해주면 되는 것이다.



views.py 수정하기

# views.py

from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.contrib.auth import login

def signup_view(request):
    ...

def login_view(request):
    if request.method == "POST":
        form = AuthenticationForm(data=request.POST)
        if form.is_valid():
            user = form.get_user()
            login(request, user)
            if 'next' in request.POST:
                return redirect(request.POST.get('next'))
            return redirect('articles:article_list')
    form = AuthenticationForm()
    context = {'form':form}
    return render(request, 'accounts/login.html', context)

여기서 일반적인 로그인 구현에 더해서, 만약 'next'request.POST에 있다면 request.POST.get('next')로 redirect 하게끔 구현해주었다. 이를 통해 로그인을 하면 원하는 페이지로 바로 접근이 가능하게끔 구현을 해주었다.