우리가 흔히 다른 웹사이트를 사용할 때 이런 경험이 있을 것이다:
- 특정 페이지(A)에 들어가려고 한다
- 로그인이 되어 있지 않으므로 웹사이트에서 바로 로그인 페이지로 redirect한다.
- 로그인을 한다
- 로그인 후 원래 가려던 페이지(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 하게끔 구현해주었다. 이를 통해 로그인을 하면 원하는 페이지로 바로 접근이 가능하게끔 구현을 해주었다.
'Django 공부하기' 카테고리의 다른 글
<Django 공부하기> 웹사이트 slug 추가하기 (0) | 2020.11.30 |
---|---|
<Django 공부하기> Password Change 구현하기 - (1) (0) | 2020.11.25 |
<Django 공부하기> @property decorator 알아보기 (0) | 2020.11.18 |
<Django 공부하기> 회원탈퇴 구현하기 (2) - 본인인증 후 회원탈퇴 (Deleting User After Authentication) - cleaned_data / widgets / (0) | 2020.11.16 |
<Django 공부하기> templates 폴더를 Root Directory에 정의하기 (templates 폴더를 apps 폴더 안에서 찾게 하지 않기) (0) | 2020.11.13 |