장고의 로그인, 로그아웃을 도와주는 앱 django.contrib.auth
장고 프로젝트 생성시 config / settings에 자동으로 추가됨
이걸 이용해서 로그인/로그아웃 구현하기
pybo앱에 로그인/로그아웃 구현하면 관리 어려우니까 새 앱common
에 구현하자
(mysite) c:\projects\mysite>django-admin startapp common
하면 앱 구조의 디렉토리 및 파일 자동으로 생성됨.
INSTALLED_APPS = [
'common.apps.CommonConfig',
]
config/urls.py 수정 -> common앱의 urls.py를 사용하기 위해
urlpatterns 에 추가 : http://localhost:8000/common/ 으로 시작하는 URL은 common/urls.py를 참조
common/urls.py 생성 및 작성
{% url 'common:login' %}
-'login' path를 추가
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'),
]
django.contrib.auth 패키지는 로그인 기능은 제공하지만 템플릿은 따로 제공하지 않음
jango.contrib.auth 패키지가 사용하는 로그인 템플릿 경로를 수정
common앱에서 동작하므로 registration/login.html 템플릿을 생성하기 보다는 common/login.html 템플릿을 생성하는 것이 관리하기 편하니까.
common/login.html 템플릿 생성 및 작성
탬플릿 dir에서 common앱용 dir 만들고 템플릿 파일 작성하기
{% extends "base.html" %}
{% block content %}
<div class="container my-3">
<form method="post" class="post-form" action="{% url 'common:login' %}">
{% csrf_token %}
{% include "form_errors.html" %}
<div class="form-group">
<label for="username">사용자ID</label>
<input type="text" class="form-control" name="username" id="username"
value="{{ form.username.value|default_if_none:'' }}">
</div>
<div class="form-group">
<label for="password">비밀번호</label>
<input type="password" class="form-control" name="password" id="password"
value="{{ form.password.value|default_if_none:'' }}">
</div>
<button type="submit" class="btn btn-primary">로그인</button>
</form>
</div>
{% endblock %}
베이스 파일 익스텐션하고 블록 콘텐츠에 작성하기
컨테이너 디브 안에 폼 하나 만들고 액션 url 주기
form_error.html
템플릿 파일 인클루드하기.
로그인에 사용되는 사용자이름(username)과 비밀번호(password)는 django.contrib.auth 가 필요로 하는 필수항목
{% if form.errors %}
{% for field in form %}
{% for error in field.errors %} <!-- 필드 오류를 출력한다. -->
<div class="alert alert-danger">
<strong>{{ field.label }}</strong>
{{ field.errors }}
</div>
{% endfor %}
{% endfor %}
{% for error in form.non_field_errors %} <!-- 넌필드 오류를 출력한다. -->
<div class="alert alert-danger">
<strong>{{ error }}</strong>
</div>
{% endfor %}
{% endif %}
필드, 넌필드 오류 모두 표시하도록. 작성함
- 필드 오류 : 사용자가 입력한 필드 값에 대한 오류로 값이 누락되었거나 필드의 형식이 일치하지 않는 경우
- 넌필드 오류: 필드의 값과는 상관없이 다른 이유로 발생하는 오류
지금 있는 admin아이디로 로그인하면 django.contrib.auth 패키지는 디폴트로 /accounts/profile/ 라는 URL로 이동함.
그러나 index 페이지로 이동되도록 바꾸기
LOGIN_REDIRECT_URL = '/'
코드에 추가
from pybo import views
urlpatterns = [
path('', views.index, name='index'), # '/' 에 해당되는 path
navbar에 로그인/로그아웃 링크가 번갈아 보이게 수정하기
{% if user.is_authenticated %}
<a class="nav-link" href="{% url 'common:logout' %}">{{ user.username }} (로그아웃)</a>
{% else %}
<a class="nav-link" href="{% url 'common:login' %}">로그인</a>
{% endif %}
if를 넣어서 로그인 한 상태면 username과 로그아웃을 보여주고 로그아웃 링크걸기.
아니면 로그인 보여주기
로그아웃 링크({% url 'common:logout' %})에 대한 path 추가하기
`path('logout/', auth_views.LogoutView.as_view(), name='logout'),
로그인 처럼 로그아웃하고 바로 index로 이동하는 url도 추가해주기
LOGOUT_REDIRECT_URL = '/'