모델을 활용해 Read, Create 기능을 다시 만들었다. 앞으로 Update, Delete를 만들 건데 그 전에 로그인, 로그아웃을 만들어 User에 따라 자신이 기입한 기이수학점 데이터를 개별적으로 확인하게 할 것이다.
메인 페이지 내에서 로그인 링크를 가지고 있는 templates/navbar.html 파일을 수정한다.
<!-- templates/navbar.html -->
<h1><a href="{% url 'sju:index' %}">나는 무슨 수업을 들었는가</a></h1>
<div>
<ul>
<li>
<a href="{% url 'common:login' %}">로그인</a>
</li>
</ul>
</div>
href 속성을 '#'에서 common:login'이라는 유의미한 URL로 매핑해주었다. 그럼 'common:login'을 만들어준다.
터미널에 django-admin startapp common
명령으로 common 앱을 생성하고 name='login' 의 path를 추가한다.
# common/urls.py
from django.urls import path
from django.contrib.auth import views as auth_views
app_name = 'common'
urlpatterns = [
path('login/', auth_views.LoginView.as_view(), name='login'),
]
보통의 path처럼 include나 view함수의 함수를 참조하지 않고 있다. 장고에서 로그인 뷰는 함수를 따로 만들 필요 없이 django.contrib.auth에서 LoginView 내장 함수를 사용하면 된다. 아주 편리.
이렇게 한 후 서버를 연결하고 로그인을 시도하면 registeration 디렉토리에 login.html 템플렛을 찾을 수 없다고 한다. urlpattern에서 사용한 LoginView는 registeration/login.html에서 로그인 템플렛을 찾는 것이 디폴트로 설정이 되어 있기 때문이다. LoginView가 우리가 만든 common 디렉토리의 login.html을 찾을 수 있도록 도와주자.
# common/urls.py
urlpatterns = [
path('login/', auth_views.LoginView.as_view(template_name='common/login.html'), name='login'),
]
templates에 common 디렉토리를 만들고 login.html을 다음과 같이 작성해준다.
<!-- templates/common/login.html -->
{% extends 'base.html' %}
{% block content %}
<div>
<form action="{% url 'common:login' %}" method="post">
{% csrf_token %}
<div>
<label for="username">사용자ID</label>
<input type="text" name="username" id="username"
value="{{form.username.value|default_if_none:''}}" placeholder="User Name">
</div>
<div>
<label for="password">비밀번호</label>
<input type="text" name="password" id="password"
value="{{form.password.value|default_if_none:''}}" placeholder="Password">
</div>
<button type="submit">로그인</button>
</form>
</div>
{% endblock %}
LoginView에서 위 템플렛을 참조하고 있기 때문에 django.contrib.auth가 필수적으로 요구하는 항목을 포함하고 있어야 한다. (username과 password)
서버를 키면 로그인 창이 나온다. 현재 데이터베이스에는 슈퍼계정(장고 관리자 계정) 정보만 있다.
슈퍼계정으로 로그인하면 account/profile 페이지를 찾을 수 없다 뜨면 성공이다. django.contrib.auth에서 디폴트로 로그인 성공시 이동시킨 페이지이기 때문이다.
config/settings.py
LOGIN_REDIRECT_URL = '/sju/'
세팅파일에 추가해주면 로그인 성공 후 메인 페이지로 이동한다.
그런데 로그인에 성공해도 아직 로그인 페이지가 뜰 것이다. navbar.html을 if문으로 조금 수정해준다.
<!-- templates/common/navbar.html -->
<h1><a href="{% url 'sju:index' %}">나는 무슨 수업을 들었는가</a></h1>
<div>
<ul>
<li>
{% if user.is_authenticated %}
<a href="#">{{ user.username }} (로그아웃)</a>
{% else %}
<a href="{% url 'common:login' %}">로그인</a>
{% endif %}
</li>
</ul>
</div>
라고 작성하면?
username 옆에 로그아웃이 떠 준다.
navbar.html 파일에 로그아웃 링크를 #
에서 {% url 'common:logout' %}
이라는 유의미한 링크로 바꿔준다. 링크 추가 해줬으니 path도 추가한다.
# common/urls.py
urlpatterns = [
path('login/', auth_views.LoginView.as_view(template_name='common/login.html'), name='login'),
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]
로그인처럼 로그아웃시 redirect할 url도 세팅파일에 작성한다.
# config/settings.py
LOGIN_REDIRECT_URL = '/sju/'
LOGOUT_REDIRECT_URL = '/sju/'
끝 ~